在C++中,迭代器是一种抽象概念,用于遍历容器中的元素。迭代器提供了一种标准的方法来访问容器中的元素,而不需要了解容器的内部结构。迭代器可以被视为指向容器中元素的指针,并且它们支持多种操作,如递增、递减、解引用等。
迭代器通常与容器类一起使用,如std::vector、std::map、std::set等,不同的容器可能支持不同类型的迭代器。
迭代器的分类:
- 输入迭代器(Input Iterator):
- 只能单向遍历容器
- 只能进行一次读取操作
- 输出迭代器(Output Iterator):
- 只能单向遍历容器
- 只能进行一次写入操作
- 前向迭代器(Forward Iterator):
- 支持向前遍历
- 可以进行多次读取操作
- 双向迭代器(Bidirectional Iterator):
- 支持向前和向后遍历
- 随机访问迭代器(Random Access Iterator):
- 支持向前和向后遍历,以及随机访问
- 可以进行复杂的遍历操作,如直接跳转到特定位置
迭代器的操作:
-
递增和递减:
-
++iterator:将迭代器向前移动到下一个元素
-
–iterator:将迭代器向后移动到上一个元素
std::vector<int> vec = { 1, 2, 3, 4, 5 }; for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << std::endl; std::cout << *(++it) << std::endl; std::cout << *(--it) << std::endl; if (*it == 2) { break; } } --------- 1 2 1 2 3 2
-
-
解引用:
-
*iterator:访问迭代器当前指向的元素
std::vector<int> vec = { 1, 2, 3, 4, 5 }; // 使用迭代器遍历vector for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; // 1 2 3 4 5 } std::cout << std::endl; // 使用auto关键字简化迭代器的类型 for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; // 1 2 3 4 5 } std::cout << std::endl; // 使用基于范围的for循环(C++11及以上) for (int val : vec) { std::cout << val << " "; // 1 2 3 4 5 } std::cout << std::endl; // 使用指针遍历vector int* ptr = vec.data(); // 获取指向vector数据的指针 for (int i = 0; i < vec.size(); ++i) { std::cout << ptr[i] << " "; // 1 2 3 4 5 }
-
-
成员访问运算符:
- iterator->member:访问迭代器当前指向的元素的成员
-
比较:
- iterator1 == iterator2:检查两个迭代器是否相等
- iterator1 != iterator2:检查两个迭代器是否不相等
使用迭代器需要注意的几点:
- 迭代器的类型应该与容器的类型相匹配
- 在容器的末尾使用迭代器时要小心,因为vec.end()返回的是尾后迭代器,它不等于任何有效的元素迭代器
- 修改容器(如插入或删除元素)可能会使迭代器失效