std::vector是C++标准库中的容器,用于存储动态大小的元素序列。它提供了一组丰富的操作函数,包括迭代器和大小调整/保留的函数。
- 迭代器:
std::vector提供了多种迭代器,包括begin()、end()、rbegin()、rend()等。这些迭代器用于遍历vector中的元素。例如,使用begin()和end()可以遍历vector中的所有元素:std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
// 输出:1 2 3 4 5
- 大小调整/保留:
std::vector提供了多种函数来调整或保留其大小,包括resize()、reserve()和shrink_to_fit()。std::vector<int> vec = {1, 2, 3};
vec.resize(5); // 增加大小为5,新增元素使用默认值0进行初始化
// vec: {1, 2, 3, 0, 0}
vec.resize(2); // 减小大小为2,超出范围的元素被删除
// vec: {1, 2}
- resize()函数用于改变vector的大小,可以增加或减少元素的数量。如果增加大小,新元素将使用默认值进行初始化。如果减小大小,超出范围的元素将被删除。
- reserve()函数用于预留vector的存储空间,以避免频繁的重新分配内存。它可以提高插入元素的效率。std::vector<int> vec;
vec.reserve(100); // 预留100个元素的存储空间
- shrink_to_fit()函数用于释放vector占用的多余内存,将其容量调整为与大小相匹配。注意,这个函数并不保证一定会释放内存,具体实现取决于编译器和标准库的实现。std::vector<int> vec = {1, 2, 3};
vec.resize(0); // 清空vector中的元素
vec.shrink_to_fit(); // 释放多余的内存
std::vector的奇怪/有趣的行为:
- 在使用迭代器遍历vector时,如果在遍历过程中对vector进行了大小调整(如插入或删除元素),迭代器可能会失效,导致未定义行为。因此,在遍历过程中最好避免修改vector的大小。
- 当使用resize()函数增加vector的大小时,新增的元素会使用默认值进行初始化。这意味着如果vector存储的是自定义类型,需要确保该类型有默认的构造函数。
- 当使用resize()函数减小vector的大小时,超出范围的元素会被删除。但是,它们的析构函数不会被调用。如果vector存储的是指针或包含资源的对象,需要手动释放这些资源,以避免内存泄漏。
- 在使用reserve()函数预留存储空间时,并不会改变vector的大小。因此,如果在预留空间之后直接使用下标访问vector中的元素,可能会导致访问越界。
总结:
std::vector是C++中常用的动态数组容器,提供了丰富的操作函数。在使用迭代器遍历vector时,需要注意避免修改vector的大小。在调整vector的大小时,需要注意元素的初始化和资源的释放。使用reserve()函数可以提高插入元素的效率,而shrink_to_fit()函数可以释放多余的内存。