【C++】STL—— unordered

2024-03-18 7820阅读

文章目录

  • 1. unordered_map的介绍
  • 2. unordered_map的使用
    • 2.1unordered_map的构造函数
    • 2.2unordered_map的迭代器
    • 2.3unordered_map的容量和访问函数
    • 2.4unordered_map的增删查改函数

      1. unordered_map的介绍

      unordered_map的介绍

      【C++】STL—— unordered 第1张

        (1)unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。

        (2)在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。

        (3)在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

        (4)unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。

        (5)unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问value。

        (6)它的迭代器至少是前向迭代器。

                   

      unordered_map和map的区别:

        (1)底层实现:map内部使用红黑树(一种自平衡二叉查找树)来实现,而unordered_map则使用哈希表来实现。因此,在map中,元素是按照键的大小进行有序排列的,而在unordered_map中,则不保证元素的顺序。

        (2)性能表现:当需要有序地遍历元素时,map的性能比unordered_map更好。 但是,当需要快速查找特定的元素时,unordered_map通常比map更快。原因在于,map在插入和删除操作时需要维护红黑树的平衡,而unordered_map则只需要计算哈希值并将元素放入相应的桶中即可。

        (3)用途:由于map可以保证元素的有序性,所以适合用于需要有序的情况下,例如按照键排序输出元素、寻找最小值/最大值等。而unordered_map则适合用于需要快速查找元素的情况下,例如查找是否存在某个键值对、统计某个值出现的次数等。

                   

      2. unordered_map的使用

      2.1unordered_map的构造函数

      【C++】STL—— unordered 第2张

        以下是几个unordered_map构造函数的例子:

        (1)默认构造函数:

      unordered_map mymap;
      

                   

        (2)使用n个元素构造unordered_map:

      unordered_map mymap = {{1, "one"}, {2, "two"}, {3, "three"}};
      

                   

        (3)使用给定的范围构造unordered_map:

      vector myVector = {{1, "one"}, {2, "two"}, {3, "three"}};  
      unordered_map mymap(myVector.begin(), myVector.end());
      

                   

        (4)使用给定的哈希函数和相等比较函数构造unordered_map:

      struct myHashFunction {  
          size_t operator()(const int& key) const {  
              return hash()(key);  
          }  
      };  
        
      struct myEqualFunction {  
          bool operator()(const int& key1, const int& key2) const {  
              return key1 == key2;  
          }  
      };  
        
      unordered_map mymap;
      

                   

      2.2unordered_map的迭代器

      【C++】STL—— unordered 第3张

      【C++】STL—— unordered 第4张

                   

      函数声明功能介绍
      begin返回unordered_map第一个元素的迭代器
      end返回unordered_map最后一个元素下一个位置的迭代器
      cbegin返回unordered_map第一个元素的const迭代器
      cend返回unordered_map最后一个元素下一个位置的const迭代器

                   

        以下是使用unordered_map迭代器的示例:

        (1)使用迭代器遍历unordered_map,从begin()到end()。在循环中,使用it->first和it->second分别访问键和值。

      #include   
      #include   
        
      int main() {  
          std::unordered_map mymap = {{1, "one"}, {2, "two"}, {3, "three"}};  
        
          // 使用迭代器遍历unordered_map  
          for (auto it = mymap.begin(); it != mymap.end(); ++it) {  
              std::cout   
          std::unordered_map{1, "one"}, {2, "two"}, {3, "three"}};  
        
          // 使用范围for循环遍历unordered_map  
          for (const auto& pair : mymap) {  
              std::cout   
          std::unordered_map  
              std::cout   
              std::cout {1, "one"}, {2, "two"}, {3, "three"}};  
            
          if (myMap.empty()) {  
              std::cout   
              std::cout   
          std::unordered_map{1, "one"}, {2, "two"}, {3, "three"}};  
            
          std::cout   
          std::unordered_map  
          // 键存在于unordered_map中  
          std::cout   
          // 键不存在于unordered_map中  
          std::cout   
          std::cout   
          std::cout "key", "value"});  
        
      if (result.second) {  
          // 插入成功  
          std::cout   
          // 插入失败(键已存在)  
          std::cout   
          my_map.erase(it);  
          std::cout   
          std::cout   
          std::cout   
          std::cout 

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]