加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

C++ unordered_map迭代器的用处

发布时间:2022-07-15 22:01:16 所属栏目:语言 来源:互联网
导读:C++ STL 标准库中,unordered_map 容器迭代器的类型为前向迭代器(又称正向迭代器)。这意味着,假设 p 是一个前向迭代器,则其只能进行 *p、p++、++p 操作,且 2 个前向迭代器之间只能用 == 和 != 运算符做比较。 在 unordered_map 容器模板中,提供了表
  C++ STL 标准库中,unordered_map 容器迭代器的类型为前向迭代器(又称正向迭代器)。这意味着,假设 p 是一个前向迭代器,则其只能进行 *p、p++、++p 操作,且 2 个前向迭代器之间只能用 == 和 != 运算符做比较。
 
  在 unordered_map 容器模板中,提供了表 1 所示的成员方法,可用来获取指向指定位置的前向迭代器。
 
  下面的程序演示了表 1 中部分成员方法的用法。
  #include <iostream>
  #include <string>
  #include <unordered_map>
  using namespace std;
  int main()
  {
      //创建 umap 容器
      unordered_map<string, string> umap{
          {"Python教程","http://c.biancheng.net/python/"},
          {"Java教程","http://c.biancheng.net/java/"},
          {"Linux教程","http://c.biancheng.net/linux/"} };
      cout << "umap 存储的键值对包括:" << endl;
      //遍历输出 umap 容器中所有的键值对
      for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
          cout << "<" << iter->first << ", " << iter->second << ">" << endl;
 
  需要注意的是,在操作 unordered_map 容器过程(尤其是向容器中添加新键值对)中,一旦当前容器的负载因子超过最大负载因子(默认值为 1.0),该容器就会适当增加桶的数量(通常是翻一倍),并自动执行 rehash() 成员方法,重新调整各个键值对的存储位置(此过程又称“重哈希”),此过程很可能导致之前创建的迭代器失效。
  所谓迭代器失效,针对的是那些用于表示容器内某个范围的迭代器,由于重哈希会重新调整每个键值对的存储位置,所以容器重哈希之后,之前表示特定范围的迭代器很可能无法再正确表示该范围。但是,重哈希并不会影响那些指向单个键值对元素的迭代器。
 
  举个例子:
  #include <iostream>
  #include <unordered_map>
  using namespace std;
  int main()
  {
      //创建 umap 容器
      unordered_map<int, int> umap;
      //向 umap 容器添加 50 个键值对
      for (int i = 1; i <= 50; i++) {
          umap.emplace(i, i);
 
  程序执行结果为:
  49
  49 17
 
  观察输出结果不难发现,之前用于表示键为 49 的键值对所在范围的 2 个迭代器,重哈希之后表示的范围发生了改变。
  经测试,用于遍历整个容器的 begin()/end() 和 cbegin()/cend() 迭代器对,重哈希只会影响遍历容器内键值对的顺序,整个遍历的操作仍然可以顺利完成。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读