回到首页 / 上级目录

迭代器

在 C++ 中,迭代器是一种抽象的数据类型,用于提供对容器元素的访问方式。迭代器提供了类似指针的接口,可以遍历容器中的元素,而无需了解底层数据结构的细节。迭代器的实现方式与所操作的容器类型相关。

C++ STL 中的迭代器分为五种类型:前向迭代器、双向迭代器、随机访问迭代器、输入迭代器和输出迭代器。

每种迭代器都具有不同的能力和限制,可用于不同类型的容器和算法中。

本文介绍最常用的前三种。

前向迭代器

C++中的前向迭代器是一种迭代器类型,它能够在一个集合中按顺序遍历所有元素,并且只支持前向遍历。

前向迭代器的行为类似于指向单向链表的指针,可以顺序访问每个元素,但不能回溯到前面的元素。

前向迭代器是一种较低级别的迭代器类型,通常用于访问顺序容器中的元素,如链表和队列。

#include <iostream>
#include <forward_list>

using namespace std;

int main() {
    // 创建前向列表并添加元素
    forward_list<int> mylist = { 1, 2, 3, 4, 5 };

    // 创建前向迭代器并遍历列表
    forward_list<int>::iterator it;
    for (it = mylist.begin(); it != mylist.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

双向迭代器

双向迭代器可以在一个集合中按顺序遍历所有元素,并支持前向和后向遍历。双向迭代器类似于指向双向链表的指针,可以在容器中向前或向后移动。

双向迭代器具有前向迭代器的所有功能,并增加了向后遍历容器的能力,因此它们在许多标准库算法和容器中都得到广泛使用。例如,可以使用双向迭代器在双向链表中遍历元素或删除容器中的元素。

#include <iostream>
#include <list>

using namespace std;

int main() {
    // 创建列表并添加元素
    list<int> mylist = { 1, 2, 3, 4, 5 };

    // 创建双向迭代器并遍历列表
    list<int>::iterator it;
    for (it = mylist.begin(); it != mylist.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    // 反向遍历列表
    list<int>::reverse_iterator rit;
    for (rit = mylist.rbegin(); rit != mylist.rend(); ++rit) {
        cout << *rit << " ";
    }
    cout << endl;

    return 0;
}

随机访问迭代器

随机访问迭代器是一种在迭代器范围内支持随机访问的迭代器。它们允许您在常量时间内移动迭代器,并在常量时间内访问迭代器指向的元素,从而支持随机访问。

标准库中的 vector 和 deque 是使用随机访问迭代器实现的。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    // 创建向量并添加元素
    vector<int> myvector = { 1, 2, 3, 4, 5 };

    // 创建随机访问迭代器并遍历向量
    vector<int>::iterator it;
    for (it = myvector.begin(); it != myvector.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    // 通过索引访问向量元素
    cout << "Element at index 2: " << myvector[2] << endl;

    return 0;
}