STL迭代器:核心概念与实战指南

张开发
2026/5/4 17:23:56 15 分钟阅读
STL迭代器:核心概念与实战指南
迭代器基础概念迭代器是STL的核心组件之一提供了一种统一的方式来访问容器中的元素。迭代器类似于指针可以指向容器中的某个元素并支持解引用、递增等操作。迭代器分为五种类型输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。每种类型的迭代器支持不同的操作集合。迭代器类型与操作输入迭代器支持读取元素输出迭代器支持写入元素。前向迭代器在输入迭代器基础上增加了多次遍历的能力。双向迭代器在前向迭代器基础上增加了递减操作。随机访问迭代器在双向迭代器基础上增加了随机访问能力。#include vector #include iostream int main() { std::vectorint vec {1, 2, 3, 4, 5}; for (auto it vec.begin(); it ! vec.end(); it) { std::cout *it ; } return 0; }迭代器适配器STL提供了多种迭代器适配器如反向迭代器、插入迭代器和流迭代器。反向迭代器允许从后向前遍历容器。插入迭代器可以将元素插入到容器中。#include vector #include iterator #include algorithm int main() { std::vectorint vec {1, 2, 3}; std::vectorint dest; std::copy(vec.begin(), vec.end(), std::back_inserter(dest)); return 0; }自定义迭代器通过继承std::iterator或直接定义特定成员函数可以创建自定义迭代器。自定义迭代器需要满足迭代器概念的要求包括定义value_type、difference_type等嵌套类型。template typename T class CustomIterator { public: using value_type T; using difference_type std::ptrdiff_t; using pointer T*; using reference T; using iterator_category std::random_access_iterator_tag; // 必须实现的成员函数 reference operator*() const; pointer operator-() const; CustomIterator operator(); CustomIterator operator(int); bool operator(const CustomIterator other) const; bool operator!(const CustomIterator other) const; // 其他必要操作... };迭代器与算法STL算法通常通过迭代器操作容器。算法如std::find、std::sort等都依赖迭代器来访问和操作容器中的元素。#include algorithm #include vector int main() { std::vectorint vec {5, 3, 1, 4, 2}; std::sort(vec.begin(), vec.end()); auto it std::find(vec.begin(), vec.end(), 3); if (it ! vec.end()) { // 元素找到 } return 0; }迭代器失效问题某些容器操作会导致迭代器失效。例如std::vector在插入或删除元素后所有迭代器可能失效。理解迭代器失效的规则对于编写正确的代码至关重要。#include vector int main() { std::vectorint vec {1, 2, 3}; auto it vec.begin(); vec.push_back(4); // 可能导致迭代器失效 // 此时使用it是未定义行为 return 0; }性能考虑随机访问迭代器提供最高效的访问方式适合需要频繁随机访问的场景。双向迭代器和前向迭代器在某些场景下可能更高效尤其是在链表结构中。#include list #include vector int main() { std::listint lst {1, 2, 3}; // 双向迭代器 std::vectorint vec {1, 2, 3}; // 随机访问迭代器 // lst.begin() 2; // 错误双向迭代器不支持随机访问 vec.begin() 2; // 正确 return 0; }现代C中的迭代器C11引入了基于范围的for循环简化了迭代器的使用。C17引入了结构化绑定进一步提高了代码的可读性。#include vector int main() { std::vectorstd::pairint, int vec {{1, 2}, {3, 4}}; for (const auto [first, second] : vec) { // 使用first和second } return 0; }

更多文章