跳转至

06 迭代器、指针⚓︎

443 个字 9 行代码 预计阅读时间 2 分钟

迭代器⚓︎

当我们需要打印容器内的所有元素,或者遍历容器寻找某个元素时,就会用到一个名为迭代器(iterators)的东西。它允许我们访问容器内的所有数据,且遵循一个特定的顺序,知道下一个元素是什么。虽然所有容器都有迭代器,但它们之间不尽相同。

所有的迭代器都会有以下基本操作:

  • iter = s.begin();:初始化
  • ++iter;:递增
  • *iter;:解引用(dereferencing)
  • iter != s.end():比较
  • new_iter = iter;:复制

我们可以将迭代器分为五大类,它们的关系如下:

  • 输入 / 输出迭代器执行按序单向传递的输入 / 输出
    • 输入迭代器出现在赋值号的右端(RHSauto elem = *it;
    • 输出迭代器出现在赋值号的左端(LHS*elem = value;
  • 前向迭代器具备输入迭代器和输出迭代器的功能
  • 双向迭代器类似前向迭代器,但它能够双向迭代,比如可以--iter;
  • 随机访问迭代器,字面意思,可以通过指定偏移量,使其不按顺序迭代,类似指针,比如可以iter += 5;

STL 迭代器分类:

容器 迭代器类型
vector 随机访问
deque 随机访问
list 双向
map 双向
set 双向
stack 无迭代器
queue 无迭代器
priority queue 无迭代器

for 循环遍历容器内元素

// 一般情况
for (auto iter = set.begin(); iter != set.end(); ++iter)
    const auto& elem = *iter;

// map,解引用时用到结构化绑定
std::map<int, int> map{{1, 6}, {2, 8}, {0, 3}. {3, 9}};
for (auto iter = set.begin(); iter != set.end(); ++iter)
    const auto& [key, value] = *iter;

指针⚓︎

我们可以把迭代器看作一类特殊的指针,前者只能该指向容器内的特定元素,而后者可以指向任何对象,因为它保存的是变量的内存地址。

C 小程的课上已经介绍过指针了,这里就不再介绍了。

评论区

如果大家有什么问题或想法,欢迎在下方留言~