简要介绍C++容器vector 的用法及vector的二维用法

 

std::vector 是 C++ 标准模板库(STL)中的一个序列容器,类似于动态数组。它可以根据需要自动调整大小,提供了灵活的内存管理和丰富的操作接口。以下是 std::vector 的详细用法,包括基本操作、迭代器、容量管理、元素访问等。

一、简要介绍C++容器vector 的用法

1. 包含头文件

要使用 std::vector,需要包含头文件

#include 

2. 定义和初始化

std::vector 可以存储任何类型的元素。以下是一些常见的定义和初始化方式:

默认构造

std::vector vec; // 定义一个空的 int 类型的 vector

指定大小

std::vector vec(10); // 定义一个大小为 10 的 vector,所有元素初始化为 0
std::vector vec(10, 1); // 定义一个大小为 10 的 vector,所有元素初始化为 1

从数组初始化

int arr[] = {1, 2, 3, 4, 5};
std::vector vec(arr, arr + sizeof(arr) / sizeof(arr[0])); // 从数组初始化

从另一个容器初始化

std::vector vec1 = {1, 2, 3, 4, 5};
std::vector vec2(vec1.begin(), vec1.end()); // 从另一个 vector 初始化

使用列表初始化

std::vector vec = {1, 2, 3, 4, 5}; // 使用列表初始化

3. 基本操作

std::vector 提供了丰富的操作接口,用于添加、删除、访问和修改元素。

添加元素

vec.push_back(6); // 在 vector 的末尾添加一个元素
vec.insert(vec.begin() + 2, 10); // 在指定位置插入一个元素

删除元素

vec.pop_back(); // 删除 vector 的最后一个元素
vec.erase(vec.begin() + 2); // 删除指定位置的元素

清空所有元素

vec.clear(); // 清空 vector 中的所有元素

4. 迭代器

std::vector 提供了迭代器,用于遍历容器中的元素。

使用迭代器遍历

for (std::vector::iterator it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " ";
}
std::cout << std::endl;

使用范围 for 循环

for (int value : vec) {
    std::cout << value << " ";
}
std::cout << std::endl;

5. 容量管理

std::vector 提供了一些方法来管理其容量和大小。

获取大小

size_t size = vec.size(); // 获取 vector 的当前大小
size_t capacity = vec.capacity(); // 获取 vector 的当前容量

改变大小

vec.resize(15); // 改变 vector 的大小,新元素默认初始化为 0
vec.resize(15, 1); // 改变 vector 的大小,新元素初始化为 1

预分配内存

vec.reserve(20); // 预分配内存,避免多次重新分配

6. 元素访问

std::vector 提供了多种方式访问其元素。

使用下标访问

int value = vec[0]; // 访问第一个元素
vec[0] = 10; // 修改第一个元素

使用 at 方法访问

int value = vec.at(0); // 访问第一个元素,范围检查
vec.at(0) = 10; // 修改第一个元素,范围检查

访问首尾元素

int first = vec.front(); // 访问第一个元素
int last = vec.back(); // 访问最后一个元素

7. 查找和排序

std::vector 可以与 STL 算法一起使用,例如查找和排序。

查找元素

auto it = std::find(vec.begin(), vec.end(), 10); // 查找值为 10 的元素
if (it != vec.end()) {
    std::cout << "Found: " << *it << std::endl;
} else {
    std::cout << "Not found" << std::endl;
}

排序

std::sort(vec.begin(), vec.end()); // 对 vector 进行排序

8. 示例代码

以下是一个完整的示例代码,展示了 std::vector 的基本用法:

#include 
#include 
#include  // 用于 std::find 和 std::sort

int main() {
    std::vector vec = {5, 2, 9, 1, 5, 6};

    // 添加元素
    vec.push_back(10);
    vec.insert(vec.begin() + 2, 20);

    // 删除元素
    vec.pop_back();
    vec.erase(vec.begin() + 2);

    // 查找元素
    auto it = std::find(vec.begin(), vec.end(), 9);
    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl;
    } else {
        std::cout << "Not found" << std::endl;
    }

    // 排序
    std::sort(vec.begin(), vec.end());

    // 遍历并输出
    for (int value : vec) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

9. 注意事项

  • 动态内存管理std::vector 会自动管理内存,但在频繁插入和删除元素时,可能会导致多次内存重新分配。使用 reserve 方法可以预先分配足够的内存,提高性能。

  • 范围检查:使用 at 方法访问元素时,会进行范围检查,如果索引超出范围,会抛出 std::out_of_range 异常。使用下标访问时,不会进行范围检查,可能会导致未定义行为。

  • 迭代器失效:在向 std::vector 中插入或删除元素时,可能会导致迭代器失效。如果需要在迭代过程中修改容器,建议使用下标访问或重新获取迭代器。

std::vector 是一个非常强大且灵活的容器,适用于各种需要动态数组的场景。

二、vector的二维使用方法

std::vector 的二维使用方法本质上是通过嵌套 std::vector 来实现的。二维 std::vector 可以看作是一个动态数组的数组,类似于二维数组。以下是二维 std::vector 的定义、初始化、访问和操作的详细用法。

1. 定义和初始化

默认构造

std::vector> vec2D; // 定义一个空的二维 vector

指定大小

std::vector> vec2D(3, std::vector(4)); 
// 定义一个 3x4 的二维 vector,所有元素初始化为 0

使用列表初始化

std::vector> vec2D = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
}; // 使用列表初始化

2. 访问和修改元素

使用下标访问

int value = vec2D[0][1]; // 访问第 1 行第 2 列的元素
vec2D[0][1] = 10; // 修改第 1 行第 2 列的元素

使用 at 方法访问

int value = vec2D.at(0).at(1); // 访问第 1 行第 2 列的元素,范围检查
vec2D.at(0).at(1) = 10; // 修改第 1 行第 2 列的元素,范围检查

3. 遍历二维 vector

使用嵌套循环

for (size_t i = 0; i < vec2D.size(); ++i) {
    for (size_t j = 0; j < vec2D[i].size(); ++j) {
        std::cout << vec2D[i][j] << " ";
    }
    std::cout << std::endl;
}

使用范围 for 循环

for (const auto& row : vec2D) {
    for (int value : row) {
        std::cout << value << " ";
    }
    std::cout << std::endl;
}

4. 添加和删除行或列

添加行

vec2D.push_back({10, 20, 30}); // 在二维 vector 的末尾添加一行

删除行

vec2D.pop_back(); // 删除二维 vector 的最后一行

添加列

for (auto& row : vec2D) {
    row.push_back(100); // 在每一行的末尾添加一个元素
}

删除列

for (auto& row : vec2D) {
    row.pop_back(); // 删除每一行的最后一个元素
}

5. 动态调整大小

改变行数

vec2D.resize(5, std::vector(3)); // 改变二维 vector 的行数为 5,每行大小为 3

改变列数

for (auto& row : vec2D) {
    row.resize(4); // 改变每一行的大小为 4
}

6. 示例代码

以下是一个完整的示例代码,展示了二维 std::vector 的基本用法:

#include 
#include 

int main() {
    // 定义一个 3x4 的二维 vector,所有元素初始化为 0
    std::vector> vec2D(3, std::vector(4, 0));

    // 修改元素
    vec2D[0][1] = 10;
    vec2D[1][2] = 20;

    // 添加一行
    vec2D.push_back({1, 2, 3, 4});

    // 添加一列
    for (auto& row : vec2D) {
        row.push_back(100);
    }

    // 遍历并输出
    for (const auto& row : vec2D) {
        for (int value : row) {
            std::cout << value << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

7. 注意事项

  • 动态内存管理:二维 std::vector 会自动管理内存,但在频繁插入和删除元素时,可能会导致多次内存重新分配。使用 reserve 方法可以预先分配足够的内存,提高性能。

  • 范围检查:使用 at 方法访问元素时,会进行范围检查,如果索引超出范围,会抛出 std::out_of_range 异常。使用下标访问时,不会进行范围检查,可能会导致未定义行为。

  • 迭代器失效:在向二维 std::vector 中插入或删除元素时,可能会导致迭代器失效。如果需要在迭代过程中修改容器,建议使用下标访问或重新获取迭代器。

二维 std::vector 是一个非常强大且灵活的容器,适用于各种需要动态二维数组的场景。通过合理使用其提供的方法和接口,可以高效地管理数据。

简要介绍C++容器vector 的用法及vector的二维用法_第1张图片

收藏加关注,观看不迷路

你可能感兴趣的:(编程语言知识点,#C++知识点,c++,编程知识点)