加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

C++ STL unordered_map获取元素的4种方案

发布时间:2022-07-15 21:06:21 所属栏目:语言 来源:互联网
导读:通过前面的学习我们知道,unordered_map 容器以键值对的方式存储数据。为了方便用户快速地从该类型容器提取出目标元素(也就是某个键值对的值),unordered_map 容器类模板中提供了以下几种方法。 1) unordered_map 容器类模板中,实现了对 [ ] 运算符的重
  通过前面的学习我们知道,unordered_map 容器以键值对的方式存储数据。为了方便用户快速地从该类型容器提取出目标元素(也就是某个键值对的值),unordered_map 容器类模板中提供了以下几种方法。
 
  1) unordered_map 容器类模板中,实现了对 [ ] 运算符的重载,使得我们可以像“利用下标访问普通数组中元素”那样,通过目标键值对的键获取到该键对应的值。
 
  举个例子:
  #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/"} };
      //获取 "Java教程" 对应的值
      string str = umap["Java教程"];
      cout << str << endl;
      return 0;
  }
  程序输出结果为:
  http://c.biancheng.net/java/
 
 
  需要注意的是,如果当前容器中并没有存储以 [ ] 运算符内指定的元素作为键的键值对,则此时 [ ] 运算符的功能将转变为:向当前容器中添加以目标元素为键的键值对。举个例子:
  #include <iostream>
  #include <string>
  #include <unordered_map>
  using namespace std;
  int main()
  {
      //创建空 umap 容器
      unordered_map<string, string> umap;
      //[] 运算符在 = 右侧
      string str = umap["STL教程"];
      //[] 运算符在 = 左侧
      umap["C教程"] = "http://c.biancheng.net/c/";
     
      for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
          cout << iter->first << " " << iter->second << endl;
      }
      return 0;
  }
  程序执行结果为:
  C教程 http://c.biancheng.net/c/
  STL教程
 
  可以看到,当使用 [ ] 运算符向 unordered_map 容器中添加键值对时,分为 2 种情况:
  当 [ ] 运算符位于赋值号(=)右侧时,则新添加键值对的键为 [ ] 运算符内的元素,其值为键值对要求的值类型的默认值(string 类型默认值为空字符串);
  当 [ ] 运算符位于赋值号(=)左侧时,则新添加键值对的键为 [ ] 运算符内的元素,其值为赋值号右侧的元素。
 
  2) unordered_map 类模板中,还提供有 at() 成员方法,和使用 [ ] 运算符一样,at() 成员方法也需要根据指定的键,才能从容器中找到该键对应的值;不同之处在于,如果在当前容器中查找失败,该方法不会向容器中添加新的键值对,而是直接抛出out_of_range异常。
 
  举个例子:
  #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/"} };
      //获取指定键对应的值
      string str = umap.at("Python教程");
      cout << str << endl;
      //执行此语句会抛出 out_of_range 异常
      //cout << umap.at("GO教程");
      return 0;
  }
  程序执行结果为:
  http://c.biancheng.net/python/
 
  此程序中,第 13 行代码用于获取 umap 容器中键为“Python教程”对应的值,由于 umap 容器确实有符合条件的键值对,因此可以成功执行;而第 17 行代码,由于当前 umap 容器没有存储以“Go教程”为键的键值对,因此执行此语句会抛出 out_of_range 异常。
 
  3) [ ] 运算符和 at() 成员方法基本能满足大多数场景的需要。除此之外,还可以借助 unordered_map 模板中提供的 find() 成员方法。
 
  和前面方法不同的是,通过 find() 方法得到的是一个正向迭代器,该迭代器的指向分以下 2 种情况:
  当 find() 方法成功找到以指定元素作为键的键值对时,其返回的迭代器就指向该键值对;
  当 find() 方法查找失败时,其返回的迭代器和 end() 方法返回的迭代器一样,指向容器中最后一个键值对之后的位置。
 
  举个例子:
  #include <iostream>
  #include <string>
  #include <unordered_map>
  using namespace std;
  int main()
   
  程序执行结果为:
  http://c.biancheng.net/java/
 
  以上 4 种方法中,前 2 种方法基本能满足多数场景的需要,建议初学者首选 at() 成员方法!

(编辑:大连站长网)

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