<iterator> 迭代器

<iterator> 头文件定义了 C++ 标准库中使用的各种迭代器类型和相关工具。迭代器是一种用于遍历容器的抽象机制,它提供了统一的接口来访问容器中的元素,无论容器的实际类型如何。掌握迭代器的使用可以帮助编写更通用且可维护的代码。

1. 迭代器的基本概念

迭代器是一个对象,提供了一组操作来访问和遍历容器中的元素。它们类似于指针,可以进行解引用、前进和比较操作。根据其功能和用途,迭代器通常分为以下几种类型:

  • 输入迭代器(Input Iterator):支持只读操作,允许从容器中读取元素。
  • 输出迭代器(Output Iterator):支持只写操作,允许向容器中写入元素。
  • 前向迭代器(Forward Iterator):支持多次读取和写入操作,能够向前遍历容器。
  • 双向迭代器(Bidirectional Iterator):支持双向遍历容器,即可以向前和向后移动。
  • 随机访问迭代器(Random Access Iterator):支持直接访问容器中的任意位置,具有随机访问能力。

2. 迭代器类型

2.1 std::iterator

std::iterator 是一个基类模板,提供了迭代器的基本接口和类型定义。虽然现代 C++ 不再推荐直接使用 std::iterator,它仍然对理解迭代器的工作原理有帮助。

语法

template<
    typename Category,
    typename T,
    typename Distance = std::ptrdiff_t,
    typename Pointer = T*,
    typename Reference = T&
>
class iterator;
  • Category:迭代器的类别(如 std::input_iterator_tagstd::output_iterator_tag 等)。
  • T:迭代器指向的值的类型。
  • Distance:迭代器之间的距离类型(通常为 std::ptrdiff_t)。
  • Pointer:指向值的指针类型。
  • Reference:对值的引用类型。

2.2 std::iterator_traits

std::iterator_traits 是一个辅助模板,用于提取迭代器类型的信息,如迭代器的值类型、指针类型和引用类型。

语法

template<typename Iterator>
struct iterator_traits;

示例

#include <iterator>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    using Iter = std::vector<int>::iterator;

    std::cout << "Value type: " << typeid(std::iterator_traits<Iter>::value_type).name() << std::endl;
    std::cout << "Pointer type: " << typeid(std::iterator_traits<Iter>::pointer).name() << std::endl;
    std::cout << "Reference type: " << typeid(std::iterator_traits<Iter>::reference).name() << std::endl;

    return 0;
}

2.3 std::reverse_iterator

std::reverse_iterator 是一个适配器,用于将正向迭代器转换为反向迭代器,从而实现反向遍历。

语法

template<typename Iterator>
class reverse_iterator;

示例

#include <vector>
#include <iostream>
#include <iterator>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    std::cout << "Reverse traversal: ";
    for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) {
        std::cout << *rit << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. 常用迭代器操作

3.1 解引用

通过迭代器访问容器中的元素。

std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = vec.begin();
std::cout << *it << std::endl; // 输出:1

3.2 递增和递减

前进或后退到下一个或上一个元素。

std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = vec.begin();
++it; // 前进到第二个元素
std::cout << *it << std::endl; // 输出:2

--it; // 返回到第一个元素
std::cout << *it << std::endl; // 输出:1

3.3 随机访问

对于支持随机访问的迭代器,可以直接进行加减操作。

std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = vec.begin() + 2;
std::cout << *it << std::endl; // 输出:3

4. 总结

迭代器是 C++ 标准库中处理容器元素的核心工具。它们提供了一种一致的方式来访问和操作容器中的数据,使得容器之间的代码更具通用性和可移植性。了解和掌握迭代器的使用,可以显著提高 C++ 编程的效率和灵活性。