在C++11的STL设计中,迭代器是容器与算法之间的核心桥梁。它解决了裸指针在泛型编程中的根本缺陷:
// 裸指针访问list的致命缺陷
std::list<int> lst{1,2,3};
int* p = &lst.front(); // 无法获取有效指针链
++p; // 错误!无法跳转到下个节点
迭代器核心能力(C++11标准)
1. 五大类型继承关系
2. 关键特性对比
迭代器类型 | 核心操作 | 典型容器 |
---|---|---|
输入迭代器 | *it , ++ | istream_iterator |
前向迭代器 | + 可复写 | forward_list |
双向迭代器 | + -- | list , map |
随机访问迭代器 | + +=n , it[n] | vector , array |
工程实践要点
1. 失效陷阱规避
std::vector<int> vec{1,2,3};
auto it = vec.begin();vec.push_back(4); // 可能导致重分配
// it 已失效!不可再访问it = vec.begin(); // 正确:重新获取迭代器
2. 容器专属迭代器特性
// list迭代器的稳定性
std::list<int> lst{1,2,3};
auto it = ++lst.begin();
lst.insert(lst.begin(), 0); // it仍指向元素2// vector的连续迭代器
std::vector<int> vec{1,2,3};
int* p = &vec[0] + 1; // 直接计算地址
安全操作规范
// 安全擦除元素范式
for (auto it = cont.begin(); it != cont.end(); ) {if (*it % 2 == 0) {it = cont.erase(it); // 返回下一有效迭代器} else {++it;}
}
设计本质:迭代器通过统一接口(
begin()/end()
)解耦算法与容器,使STL算法能无缝应用于不同数据结构:// 通用算法示例 std::sort(vec.begin(), vec.end()); // vector: 可排序 lst.sort(); // list: 专用排序
深度探索推荐:C++学习一站式分享