STL:vector的使用(初识迭代器&迭代器失效)
**STL:vector的使用**
在C++中,标准模板库(STL)提供了许多高级数据结构和算法。其中,`vector`是最常用的动态数组类,它支持随机访问、插入和删除元素等操作。在本文中,我们将介绍如何使用`vector`,并初识迭代器和迭代器失效。
###什么是vector?
`vector`是一种动态数组类,它可以根据需要自动扩展或收缩。它支持随机访问、插入和删除元素等操作。`vector`的主要特点是:
* 支持随机访问:可以通过下标直接访问任何元素。
* 支持插入和删除:可以在任意位置插入或删除元素。
### 如何使用vector?
要使用`vector`,需要包含头文件 `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`时必须小心避免迭代器失效。可以通过保存当前迭代器的值并创建新迭代器来避免这种情况。