C++中的迭代器是一种抽象的数据访问对象,它允许对容器中的元素进行遍历,而不必暴露底层数据结构的细节。迭代器提供了一种通用的方法来访问容器中的元素,无论容器的类型是什么。C++标准库中的许多容器(如vector、list、map等)都支持迭代器。
1. 迭代器的种类和特性:
1.1 输入迭代器(Input Iterator):
可以从序列中读取值。只能单趟遍历,不能多次遍历同一序列。
例如:istream_iterator。
1.2 输出迭代器(Output Iterator):
可以写入值到序列中。只能单趟遍历,不能多次遍历同一序列。
例如:ostream_iterator。
1.3 前向迭代器(Forward Iterator):
可以在同一序列上进行多趟读写操作,但只能单向移动。支持 ++ 操作。
例如:std::forward_iterator_tag。
1.4 双向迭代器(Bidirectional Iterator):
可以在同一序列上进行多趟读写操作,并支持双向移动(向前和向后)。支持 ++ 和 – 操作。
例如:std::bidirectional_iterator_tag。
1.5 随机访问迭代器(Random Access Iterator):
提供对元素的随机访问,支持指针算术运算。支持 ++, --, +=, -=, <, >, <=, >= 等操作。
例如:std::random_access_iterator_tag。
2. 迭代器的基本操作:
2.1 begin() 和 end():
begin() 返回指向容器第一个元素的迭代器。
end() 返回指向容器末尾(最后一个元素之后)的迭代器。
2.2 * 运算符:
用于访问迭代器指向的元素。
2.3 ++ 和 – 运算符:
++ 将迭代器移动到下一个元素。
– 将迭代器移动到前一个元素。
3. 迭代器的应用:
3.1 容器遍历:
std::vector<int> myVector = {1, 2, 3, 4, 5}; for (auto it = myVector.begin(); it != myVector.end(); ++it) { std::cout << *it << " "; }
3.2 算法与迭代器结合:
#include <algorithm> std::vector<int> myVector = {5, 3, 1, 4, 2}; std::sort(myVector.begin(), myVector.end());
3.3 自定义容器与迭代器:
class MyContainer { private: int data[5] = {1, 2, 3, 4, 5}; public: class iterator { private: int* ptr; public: iterator(int* p) : ptr(p) {} int& operator*() { return *ptr; } iterator& operator++() { ++ptr; return *this; } bool operator!=(const iterator& other) const { return ptr != other.ptr; } }; iterator begin() { return iterator(data); } iterator end() { return iterator(data + 5); } }; MyContainer myContainer; for (auto it = myContainer.begin(); it != myContainer.end(); ++it) { std::cout << *it << " "; }
4. 迭代器范围:
迭代器通常用于表示一个范围,包括起始位置和终止位置。可以使用两个迭代器来表示一个容器中的一段元素。
std::vector<int> myVector = {1, 2, 3, 4, 5}; auto start = myVector.begin() + 1; auto end = myVector.end() - 1; for (auto it = start; it != end; ++it) { std::cout << *it << " "; }