`计算机知识` std::lower_bound和std::upper_bound, 有序关联容器set/map,无序关联容器unordered, 迭代器

迭代器分类

  • 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两个重载函数, 但有些容器的iteratorconst_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来访问,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值