06 迭代器、指针⚓︎
约 443 个字 9 行代码 预计阅读时间 2 分钟
迭代器⚓︎
当我们需要打印容器内的所有元素,或者遍历容器寻找某个元素时,就会用到一个名为迭代器(iterators)的东西。它允许我们访问容器内的所有数据,且遵循一个特定的顺序,知道下一个元素是什么。虽然所有容器都有迭代器,但它们之间不尽相同。
所有的迭代器都会有以下基本操作:
iter = s.begin();
:初始化++iter;
:递增*iter;
:解引用(dereferencing)iter != s.end()
:比较new_iter = iter;
:复制
我们可以将迭代器分为五大类,它们的关系如下:
- 输入 / 输出迭代器执行按序单向传递的输入 / 输出
- 输入迭代器出现在赋值号的右端(RHS
) :auto elem = *it;
- 输出迭代器出现在赋值号的左端(LHS
) :*elem = value;
- 输入迭代器出现在赋值号的右端(RHS
- 前向迭代器具备输入迭代器和输出迭代器的功能
- 双向迭代器类似前向迭代器,但它能够双向迭代,比如可以
--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 小程的课上已经介绍过指针了,这里就不再介绍了。
评论区
如果大家有什么问题或想法,欢迎在下方留言~