当前位置:实例文章 » 其他实例» [文章]STL:vector的使用(初识迭代器&迭代器失效)

STL:vector的使用(初识迭代器&迭代器失效)

发布人:shili8 发布时间:2025-02-12 13:29 阅读次数:0

**STL:vector的使用**

在C++中,标准模板库(STL)提供了许多高级数据结构和算法。其中,`vector`是最常用的动态数组类,它支持随机访问、插入和删除元素等操作。在本文中,我们将介绍如何使用`vector`,并初识迭代器和迭代器失效。

###什么是vector?

`vector`是一种动态数组类,它可以根据需要自动扩展或收缩。它支持随机访问、插入和删除元素等操作。`vector`的主要特点是:

* 支持随机访问:可以通过下标直接访问任何元素。
* 支持插入和删除:可以在任意位置插入或删除元素。

### 如何使用vector?

要使用`vector`,需要包含头文件 `` 并使用 `std::vector` 来声明一个`vector`对象,其中 `T` 是元素类型。例如:

cpp#include <vector>

int main() {
 std::vector<int> vec; // 声明一个空的vector return0;
}


### vector的基本操作`vector`提供了许多基本操作,包括:

* `push_back(T)`:在末尾插入元素。
* `pop_back()`:删除末尾元素。
* `insert(iterator, T)`:在指定位置插入元素。
* `erase(iterator)`:删除指定位置的元素。

例如:

cpp#include <vector>

int main() {
 std::vector<int> vec;
 // 在末尾插入元素 vec.push_back(10);
 vec.push_back(20);
 vec.push_back(30);
 // 删除末尾元素 vec.pop_back();
 // 在指定位置插入元素 vec.insert(vec.begin(),5);
 // 删除指定位置的元素 vec.erase(vec.begin());
 return0;
}


### 迭代器迭代器是`vector`提供的一种访问元素的方式。它是一个指向容器中某个元素的对象,可以通过 `++` 或 `--` 来移动到下一个或上一个元素。

例如:

cpp#include <vector>

int main() {
 std::vector<int> vec = {10,20,30};
 // 获取迭代器 auto it = vec.begin();
 // 访问元素 while (it != vec.end()) {
 std::cout << *it << " ";
 ++it;
 }
 return0;
}


### 迭代器失效当使用迭代器访问容器中的元素时,必须小心避免迭代器失效。迭代器失效是指迭代器指向的元素已经被删除或移动,而迭代器仍然保持其原来的值。

例如:

cpp#include <vector>

int main() {
 std::vector<int> vec = {10,20,30};
 // 获取迭代器 auto it = vec.begin();
 // 删除元素 vec.erase(it);
 // 迭代器失效 while (it != vec.end()) {
 std::cout << *it << " ";
 ++it;
 }
 return0;
}


在上面的例子中,`vec.erase(it)`会删除 `10` 这个元素,而迭代器 `it`仍然指向这个已经被删除的元素。因此,在后续的循环中,`*it`会访问一个已经被删除的元素,从而导致未定义行为。

要避免这种情况,可以在删除元素之前保存当前迭代器的值,然后使用新创建的迭代器来访问容器中的元素。

例如:

cpp#include <vector>

int main() {
 std::vector<int> vec = {10,20,30};
 // 获取迭代器 auto it = vec.begin();
 // 删除元素 vec.erase(it);
 // 创建新迭代器 auto newIt = vec.begin();
 // 访问元素 while (newIt != vec.end()) {
 std::cout << *newIt << " ";
 ++newIt;
 }
 return0;
}


在上面的例子中,`vec.erase(it)`会删除 `10` 这个元素,而新创建的迭代器 `newIt`仍然指向容器中的下一个元素。因此,在后续的循环中,`*newIt`会访问正确的元素。

综上所述,使用`vector`时必须小心避免迭代器失效。可以通过保存当前迭代器的值并创建新迭代器来避免这种情况。

其他信息

其他资源

Top