catalog
迭代器分类
-
InputIterator(输入迭代器), 支持:
拷贝:auto it2 = it;
自增:++ it;
读取其值:*it
-
OutputIterator(输出迭代器)
拷贝:auto it2 = it;
自增:++ it;
修改其值:*it = 123
-
ForwardIterator(向前迭代器)
同时满足 InputIterator 和 OutputIterator 的要求。 -
BidirectionalIterator(双向迭代器)
在 ForwardIterator 的基础上支持自减 (即-- it
) -
RandomAccessIterator(随机访问迭代器)
在 BidirectionalIterator 的基础上支持加减运算和比较运算 (it += 3
)
关联容器
有序容器: set, multiset
map, multimap
无序容器: unordered_set, unordered_multiset
unordered_map, unordered_multimap
关联容器的迭代器
所有容器 (有序无序), 其返回的iterator
, 很多都是const
类型的! 即, 不允许修改!
find
lower_bound
begin()
等, 虽然分了iterator 和 const_iterator
两个重载函数, 但有些容器的iterator
和const_iterator
是同一个typedef
具体能不能修改, 实践下吧
- 对于set:
auto it = sett.begin();
*it = 123;
, 这是不可以的!!
只能是: 删除it
, 然后再插入123
- 对于map:
auto it = mapp.begin();
(*it).second = 123
, 也是不可以的!!
只能是:mapp[ (*it).first] = 123
这个写法很重要! 通过迭代器获取key, 再通过下标修改
所有容器 (有序无序) 的迭代器, 都不支持 (随机访问), 只能 一步步的移动
begin(), ..., tail, end()
, 迭代器的移动 不仅是在begin - tail
, 而且也是包括end()
元素的!!
也就是, 如果支持--
操作的话, 在end()
进行--
操作, 是会到达tail
位置的!
set/map, multiset/map
即, 有序容器的 迭代器, 是双向的 (++, --
都支持)unordered_set/multiset, unordered_map/multimap
即, 无序容器的 迭代器: 是单向的 (只能++
)
multimap
的插入操作
对于multimap, unordered_multimap
, 不可以 像往常一样: mp[ 3] = 5;
, 这是报错的
因为, 3
这个键key, 是有多个元素的, 直接mp[ 3]
这当然是歧义的, 因此 下标是禁用的
只能使用insert( {3, 5})
插入, find( 3)->second
来访问,