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 << " ";
}