刀么克瑟拉莫 2022-11-24 18:28 采纳率: 0%
浏览 2

unordered_map加速

C++可以把unordered_map全部放到静态区吗?
如果能,unordered_map放到静态区比放在堆区快多少呢?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-11-24 20:42
    关注
    • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7632628
    • 这篇博客你也可以参考下:unordered_map使用详解
    • 这篇博客也不错, 你可以看下unordered_map使用详解
    • 除此之外, 这篇博客: c++中unordered_map的用法的详述(包含unordered_map和map的区别)中的 四、c++ unordered_map容器的成员方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 下表列出了 unordered_map 类模板提供的所有常用的成员方法、各自的功能和常规的用法。

      成员方法功能用法
      begin()返回指向容器中第一个键值对的正向迭代器。auto it=mymap.begin()auto \ it = mymap.begin()auto it=mymap.begin()
      end()返回指向容器中最后一个键值对之后位置的正向迭代器。it!=mymap.end()it!=mymap.end()it!=mymap.end()
      cbegin()和 begin() 功能相同,只不过在其基础上增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。auto it=mymap.cbegin()auto \ it = mymap.cbegin()auto it=mymap.cbegin()
      cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。it!=mymap.cend()it!=mymap.cend()it!=mymap.cend()
      empty()若容器为空,则返回 true;否则 false。mymap.empty()mymap.empty()mymap.empty()
      size()返回当前容器中存有键值对的个数。mymap.size()mymap.size()mymap.size()
      max_size()返回容器所能容纳键值对的最大个数,不同的操作系统,其返回值亦不相同。mymap.max_size()mymap.max\_size()mymap.max_size()
      operator[key]该模板类中重载了 [] 运算符,其功能是可以向访问数组中元素那样,只要给定某个键值对的键 key,就可以获取该键对应的值。注意,如果当前容器中没有以 key 为键的键值对,则其会使用该键向当前容器中插入一个新键值对。string name=mymap[key];mymap[key2]=name;string \ name=mymap[key]; \\ mymap[key2] = name;string name=mymap[key];mymap[key2]=name;
      at(key)返回容器中存储的键 key 对应的值,如果 key 不存在,则会抛出 out_of_range 异常。mymap.at(key)=value;mymap .at(key) = value;mymap.at(key)=value;
      find(key)查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如 end() 方法返回的迭代器)。mymap.find(key);mymap.find(key);mymap.find(key);
      count(key)在容器中查找以 key 键的键值对的个数。mymap.count(key)mymap.count(key)mymap.count(key)
      equal_range(key)返回一个 pair 对象,其包含 2 个迭代器,用于表明当前容器中键为 key 的键值对所在的范围。mymap.equal_range(key);mymap.equal\_range(key);mymap.equal_range(key);
      emplace()向容器中添加新键值对,效率比 insert() 方法高。mymap.emplace(key,value);mymap.emplace(key, value);mymap.emplace(key,value);
      emplace_hint()向容器中添加新键值对,效率比 insert() 方法高。
      insert()向容器中添加新键值对。mymap.insert(pair<string,double>(key,value));mymap.insert({{key,value},{key,value}});mymap.insert(pair<string,double>(key,value));\\ mymap.insert(\{\{key,value\},\{key,value\}\});mymap.insert(pair<string,double>(key,value));mymap.insert({{key,value},{key,value}});
      erase()删除指定键值对。mymap.erase(key);mymap.erase(key);mymap.erase(key);
      clear()清空容器,即删除容器中存储的所有键值对。mymap.clear();mymap.clear();mymap.clear();
      swap()交换 2 个 unordered_map 容器存储的键值对,前提是必须保证这 2 个容器的类型完全相等。mymap1.swap(mymap2);mymap1.swap(mymap2);mymap1.swap(mymap2);
      bucket_count()返回当前容器底层存储键值对时,使用桶(一个线性链表代表一个桶)的数量。unsigned n=mymap.bucket_count();unsigned \ n = mymap.bucket\_count();unsigned n=mymap.bucket_count();
      max_bucket_count()返回当前系统中,unordered_map 容器底层最多可以使用多少桶。mymap.max_bucket_count()mymap.max\_bucket\_count()mymap.max_bucket_count()
      bucket_size(n)返回第 n 个桶中存储键值对的数量。unsigned nbuckets=mymap.bucket_count();unsigned \ nbuckets = mymap.bucket\_count();unsigned nbuckets=mymap.bucket_count();
      bucket(key)返回以 key 为键的键值对所在桶的编号。mymap.bucket(key)mymap.bucket (key)mymap.bucket(key)
      load_factor()返回 unordered_map 容器中当前的负载因子。负载因子,指的是的当前容器中存储键值对的数量(size())和使用桶数(bucket_count())的比值,即 load_factor() = size() \ bucket_count()。mymap.load_factor()mymap.load\_factor()mymap.load_factor()
      max_load_factor()返回或者设置当前 unordered_map 容器的负载因子。mymap.max_load_factor()mymap.max\_load\_factor()mymap.max_load_factor()
      rehash(n)将当前容器底层使用桶的数量设置为 n。mymap.rehash(20);mymap.rehash(20);mymap.rehash(20);
      reserve()将存储桶的数量(也就是 bucket_count() 方法的返回值)设置为至少容纳count个元(不超过最大负载因子)所需的数量,并重新整理容器。mymap.reserve(6);mymap.reserve(6);mymap.reserve(6);
      hash_function()返回当前容器使用的哈希函数对象。string map::hasherfn=mymap.hash_function();string \ map::hasher fn = mymap.hash\_function();string map::hasherfn=mymap.hash_function();

      注意,对于实现互换 2 个相同类型 unordered_map 容器的键值对,除了可以调用该容器模板类中提供的 swap() 成员方法外,STL 标准库还提供了同名的 swap() 非成员函数。

      4、map和unordered_map的使用

      unordered_map的用法和map是一样的,提供了insert,size,count等操作,并且里面的元素也是以pair类型来存储的,其底层实现是完全不同的,上方已经解释了,但是就外部使用来说却是一致的。

      五、举例说明

      #include<iostream>
      #include<unordered_map>
      #include<map>
      #include<string>
      using namespace std;
      
      int main()
      {
          // 注意:c++11才开始支持括号初始化
          unordered_map<int, string> myMap = {{5, "zhangsan"},{6, "lisi"}};  // 使用{}赋值
          myMap[2] = "wanger";  // 使用[ ] 进行当个插入,若已存在键值2,则赋值修改,若无则插之。
          myMap.insert(pair<int, string>(3, "mazi"));  // 使用insert和pair插入。
      
          // 遍历输出+迭代器的使用。
          auto iter = myMap.begin();  // auto自动识别为迭代器类型unordered_map<int, string>::iterator
          while(iter != myMap.end())
          {
              cout << iter->first << "," << iter->second << endl;
              ++iter;
          }
      
          // 查找元素并输出 + 迭代器的使用
          auto iterator = myMap.find(6);  // find()返回一个指向2的迭代器。
          if(iterator != myMap.end())
              cout << endl << iterator->first << "," << iterator->second << endl;
          system("pause");
          return 0;
      }
      

      此时用unordered_map 的输出结果如下所示:

      CSDN图标

      map 的输出结果如下所示:

      CSDN图标
    评论

报告相同问题?

问题事件

  • 创建了问题 11月24日

悬赏问题

  • ¥15 Oracle触发器记录修改前后的字段值
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器