C++中vector的iterator迭代器的理解
在C++中,std::vector
的迭代器(iterator)是一种用于遍历和访问容器元素的工具,其行为类似于指针。理解迭代器的位置需要从以下几个方面入手:
1. 迭代器的本质
- 迭代器是指向
vector
中某个元素的抽象指针。 - 它支持类似指针的操作,如解引用(
*it
)、自增(++it
)等。 - 迭代器的类型通常是
std::vector<T>::iterator
(或const_iterator
)。
2. 迭代器的位置范围
- 有效位置:
- 首元素:
vec.begin()
指向第一个元素。 - 尾后位置:
vec.end()
指向最后一个元素的下一个位置(不是最后一个元素!)。 - 中间位置:通过算术运算(如
begin() + i
)获得。
- 首元素:
- 无效位置:
- 解引用
vec.end()
是未定义行为(UB)。 - 迭代器失效后(如
vector
扩容),再使用它是危险的。
- 解引用
3. 迭代器位置的操作
- 访问元素:
std::vector<int> vec = {10, 20, 30}; auto it = vec.begin(); // 指向10 std::cout << *it; // 输出10 ++it; // 指向20
- 算术运算:
auto it = vec.begin() + 1; // 指向20 std::cout << *(it - 1); // 输出10(向前移动)
- 比较位置:
if (it == vec.end()) { /* 是否到达末尾 */ }
4. 迭代器失效问题
- 导致失效的操作:
push_back
、insert
、resize
等可能引发vector
扩容的操作。erase
会使被删除元素及其后的迭代器失效。
- 安全实践:
std::vector<int> vec = {1, 2, 3}; auto it = vec.begin(); vec.push_back(4); // 可能导致it失效(若扩容) // 此时应重新获取迭代器:it = vec.begin();
5. 特殊迭代器位置
- 反向迭代器:
auto rit = vec.rbegin(); // 指向最后一个元素(30) ++rit; // 指向倒数第二个元素(20)
- 常量迭代器:
auto cit = vec.cbegin(); // 不可修改指向的值
6. 代码示例
#include <iostream>
#include <vector>int main() {std::vector<int> vec = {10, 20, 30, 40};// 遍历元素for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " "; // 输出:10 20 30 40}// 插入元素(可能导致迭代器失效)auto it = vec.begin() + 2;vec.insert(it, 25); // 在30前插入25// vec = {10, 20, 25, 30, 40}// 删除元素it = vec.begin() + 1;vec.erase(it); // 删除20// vec = {10, 25, 30, 40}
}
关键总结
begin()
指向首元素,end()
指向尾后位置。- 迭代器类似指针,但需注意失效问题。
- 通过算术运算调整位置(如
it + n
),但需确保不越界。 - 反向迭代器(
rbegin()
/rend()
)提供逆向遍历。
理解迭代器位置是高效使用std::vector
的基础,尤其在涉及动态修改容器时需格外谨慎!