1.0 什么是迭代器?

摘要

迭代器是一种检查容器内元素并遍历元素的数据类型,通常用于对 C++ 中各种容器内元素的访问。

  • 指向某个位置的对象
  • 可能指向可读内存地址/对象
  • 用于以与数据布局无关的方式迭代容器元素
  • 还用于指定容器中的位置和范围 (用于插入、删除等)

2.0 从标准容器中获取元素 begin()end()

可以从标准容器中获取一些特定位置的数据 (第一个元素、最后一个元素) 获取方式有两种:

  • 成员函数

container.begin()

container.end()

  • 独立函数

std::begin(container)

std::end(container)

2.1 通过 * 来访问指定位置的元素

基于 2.0 中给出的两种通过迭代器访问特定位置元素的方法,编写示例代码:

std::vector<int> vint;

// init container
for (int i = 0; i < 10; ++i){
    vint.push_back(i);
}

auto vint_begin = vint.begin();
auto vint_end = vint.end();

//auto vint_begin = std::begin(vint);
//auto vint_end = std::end(vint);

std::cout << "vector begin - " << *vint_begin << std::endl;

return 0;

通过 *vint_begin 可以访问指定位置的元素:

  • *vint_begin
  • *(vint_begin + 1)
值得注意的是 *vint_end 迭代器仅用于位置指示器不能用于访问元素。
vector ->   |1|2|3|4|5|6|7| |
            |i|           |e|

还有一些操作

  • ++i 向终点移动 1 (--i 向起点移动 1)
vector ->   |1|2|3|4|5|6|7| |
              |i|         |e|
  • i += x 前进 x (i -= x 倒退 x)
i += 4 / 前进 4
vector ->   |1|2|3|4|5|6|7| |
                    |i|   |e|

3.0 基于迭代器的循环

通过上面对迭代器的介绍显而易见的简单用法:

for (auto i = vint.begin(); i != vint.end(); ++i){
    std::cout << *i << std::endl;
}

4.0 迭代范围

4.1 从容器中擦除 erase()

vint.erase(std::begin(vint) + 3, std::begin(vint) + 6);

END 参考与引用

[参考文章]