c++ vector的用法

std::vector 是 C++ 标准库中一个非常常用的动态数组容器。它可以存储任意数量的元素,并且提供了灵活的大小调整和对元素的快速访问。以下是 std::vector 的基本用法说明,包括常见操作和示例代码。

1. 头文件

在使用 std::vector 之前,需要包含相应的头文件:

#include 

2. 定义和初始化

可以使用以下方式定义和初始化 std::vector

std::vector vec; // 创建一个空的整数向量
std::vector vec1(10); // 创建一个包含 10 个默认初始化(0)的元素的向量
std::vector vec2(10, 5); // 创建一个包含 10 个元素,值为 5 的向量
std::vector vec3 = {1, 2, 3, 4, 5}; // 使用初始化列表

3. 常用操作

a. 添加元素

可以使用 push_back 方法在向量末尾添加元素:

vec.push_back(1);
vec.push_back(2);

如果想在特定位置插入元素,可以使用 insert 方法:

vec.insert(vec.begin() + 1, 3); // 在索引 1 处插入 3
b. 访问元素

可以使用下标操作或 at 方法访问元素:

int first = vec[0]; // 使用下标操作
int second = vec.at(1); // 使用 at 方法

注意:at 方法会进行边界检查,若索引越界会抛出异常。

c. 删除元素

可以使用 pop_back 方法删除最后一个元素,使用 erase 方法删除特定位置的元素:

vec.pop_back(); // 删除最后一个元素
vec.erase(vec.begin() + 1); // 删除索引 1 处的元素
d. 遍历元素

可以使用范围 for 循环或迭代器遍历 std::vector

for (const auto& elem : vec) {
    std::cout << elem << " ";
}

for (auto it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " ";
}
e. 获取大小和容量

可以使用 size 方法获取当前元素个数,使用 capacity 方法获取当前容量:

std::cout << "Size: " << vec.size() << std::endl;
std::cout << "Capacity: " << vec.capacity() << std::endl;
f. 清空和缩小容量

可以使用 clear 方法清空向量,使用 shrink_to_fit 方法缩小容量以适应当前大小:

vec.clear(); // 清空向量
vec.shrink_to_fit(); // 收缩容量

4. 示例代码

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

#include 
#include 

int main() {
    // 创建一个整数向量并初始化
    std::vector vec = {1, 2, 3, 4, 5};

    // 添加元素
    vec.push_back(6);
    vec.push_back(7);

    // 在索引 2 处插入元素
    vec.insert(vec.begin() + 2, 99);

    // 遍历向量
    std::cout << "Vector elements: ";
    for (const auto& elem : vec) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    // 访问元素
    std::cout << "First element: " << vec.at(0) << std::endl;
    
    // 删除元素
    vec.pop_back(); // 删除最后一个元素
    vec.erase(vec.begin() + 1); // 删除索引 1 的元素

    // 输出大小和容量
    std::cout << "Size after modifications: " << vec.size() << std::endl;
    std::cout << "Capacity after modifications: " << vec.capacity() << std::endl;

    // 清空向量
    vec.clear();
    std::cout << "Size after clearing: " << vec.size() << std::endl;

    return 0;
}

5. 注意事项

  • 动态大小std::vector 是动态数组,能够自动调整大小,但每次扩展时可能会导致重新分配内存。如果频繁地在末尾添加元素,可能会导致性能下降,特别是在大容量的情况下。可以使用 reserve() 方法预先分配足够的空间以提高性能。

    std::vector vec;
    vec.reserve(100); // 预先分配空间以容纳100个元素
    

  • 指针和迭代器:在对 std::vector 进行添加或删除操作后,所有指向其元素的指针和迭代器可能会失效。因此,在进行这些操作后,应谨慎使用指针和迭代器。

  • 内存管理std::vector 自动管理内存,但是在使用 std::vector 存储指针时,用户需要手动管理指针所指向的对象的生命周期,以避免内存泄漏。

6. 性能特点

  • 随机访问:由于 std::vector 内部是连续的内存块,访问元素的时间复杂度为 O(1),这使得它在随机访问时非常高效。

  • 插入和删除:在末尾插入和删除元素的时间复杂度平均为 O(1),但在中间插入或删除元素的时间复杂度为 O(n),因为需要移动元素。

  • 内存分配:当 std::vector 超过当前容量时,会自动分配更大的内存并将现有元素复制到新内存中,这个过程是 O(n) 的,所以在可能大量插入元素的情况下,使用 reserve() 提前分配内存会更高效。

你可能感兴趣的:(c++,开发语言,vector)