底层机制及其应用场景

发布时间:2025-06-24 17:26:42  作者:北方职教升学中心  阅读量:882


在红黑树中,元素按照键值自动排序,因此 set的插入操作不仅将元素添加到集合中,还会自动维护元素的顺序。本文将详细介绍 setmap容器的特点、

multiset的常用操作
  • 插入元素:与 set类似,可以使用 insert()函数插入元素。
  • 缺点
    • 插入和删除操作的效率比 unordered_map略低,因为需要维护平衡树结构。底层机制及其应用场景。
    std::multimap<int,std::string>mm;mm.insert({1,"one"});mm.insert({1,"uno"});// 允许插入重复的键
    • 查找元素:可以使用 equal_range()函数获取具有相同键的元素范围。
    • 元素自动排序,查找效率高。删除和查找操作,但在最坏情况下,时间复杂度可能退化为 O(n)。

    6.2 时间复杂度

    • setmap:插入、
    if(m.find(2)!=m.end()){std::cout <<"键 2 存在,值为: "<<m[2]<<std::endl;}
    • 删除元素:可以使用 erase()函数删除指定的键值对。

      unordered_map的特点
      • 无序性:键的存储顺序不固定。如果对元素的顺序没有要求且更关心操作效率,可以选择无序容器 unordered_setunordered_map

      3.6 map的优缺点

      • 优点
        • 键唯一且有序,能够自动排序。
        • 无法通过下标访问元素。
        ms.erase(10);// 删除所有值为 10 的元素

        4.2 multimap

        multimapmap的变种,允许多个相同的键映射到不同的值。插入和删除操作,时间复杂度为 O(log n)。map的实现方式和 set类似,也是基于红黑树。

      • 自动排序:元素在插入时会自动按顺序排列。每个键(key)都是唯一的,不能重复;而值(value)可以是相同的。查找和删除操作的时间复杂度为 O(log n)。

      6. set

      2.2 set的特点

      • 元素唯一性set中的元素必须是唯一的,不能有重复元素。有序的元素集合。数据表映射等。
      • 有序性set中的元素默认按升序存储,用户可以自定义排序规则。set用于存储唯一的元素集合,而 map则用于存储键值对,其中每个键都是唯一的。删除和查找的平均时间复杂度为 O(1)。对于需要存储唯一且有序数据的场景,可以选择使用 set,而对于需要以键值对方式存储数据的场景,可以选择使用 map
      s.erase(10);// 删除元素 10
      • 查找元素:可以使用 find()函数查找指定元素是否存在。
      std::cout <<"Map 的大小: "<<m.size()<<std::endl;

      3.4 map的底层实现

      map的底层实现同样基于红黑树,这保证了键值对在插入时可以自动排序,同时支持高效的查找和删除操作。

    • 无法通过下标直接访问键。unordered_set提供常数时间复杂度的插入、
    std::multiset<int>ms;ms.insert(10);ms.insert(5);ms.insert(10);// 允许插入重复元素
    • 删除元素:可以使用 erase()函数删除元素,但它会删除所有等于该值的元素。删除操作。
    • 键值对存储map存储的是键值对,每个键映射到一个值。
    #include<map>#include<iostream>intmain(){std::map<int,std::string>m;m.insert({1,"one"});m[2]="two";m[3]="three";for(constauto&pair :m){std::cout <<pair.first <<": "<<pair.second <<std::endl;}return0;}
    • 查找元素:可以使用 find()函数查找指定键是否存在。红黑树是一种平衡树,其高度大致保持在 log(n) 级别,因此能够确保操作的时间复杂度为 O(log n)。删除和查找操作的平均时间复杂度为 O(1),但最坏情况下为 O(n)。键值对中的键会自动按顺序排列,以便于快速查找、
  • 缺点
    • 插入和删除的效率比 unordered_set稍低,因为需要维护平衡树结构。multiset

      2. set容器

      2.1 什么是 set

      set是一种关联容器,用于存储唯一的、删除和查找的时间复杂度都是 O(log n)。使用方法、它们都使用红黑树(自平衡二叉搜索树)作为底层实现,因此可以提供高效的插入、

    #include<set>#include<iostream>intmain(){std::set<int>s;s.insert(10);s.insert(5);s.insert(20);s.insert(10);// 重复元素不会插入for(intval :s){std::cout <<val <<" ";// 输出:5 10 20}return0;}
    • 删除元素:可以使用 erase()函数删除指定的元素。
    • unordered_setunordered_map:存储的数据是无序的,适合只关心快速查找和插入的场景。
    • 有序性map中的键按一定顺序(默认升序)存储,用户可以自定义排序规则。插入和删除操作。

    5.2 unordered_map

    unordered_map是一种基于哈希表实现的关联容器,存储键值对,键是唯一的。

  • 快速查找map提供高效的查找机制,适合用于需要根据键快速查找对应值的场景。
  • 4. multisetmultimap

    4.1 multiset

    multisetset的变种,允许存储重复的元素。插入和删除操作,时间复杂度为 O(log n)。

    红黑树是一种平衡二叉树,保证在最坏情况下,插入、
    std::cout <<"Set 的大小: "<<s.size()<<std::endl;

    2.4 set的底层实现

    set的底层使用红黑树(自平衡二叉搜索树)实现。

    3.2 map的特点

    • 键唯一性map中的键必须是唯一的,不能有重复键。
    • 排序数据存储:由于 map中的键是有序的,它适合用于需要对数据按键进行排序的场景。

      multimap的常用操作
      • 插入键值对:可以使用 insert()函数插入键值对。
      • 哈希表实现:底层使用哈希表,因此查找、插入、
      autorange =mm.equal_range(1);for(autoit =range.first;it !=range.second;++it){std::cout <<it->first <<": "<<it->second <<std::endl;}

      5. 无序容器:unordered_setunordered_map

      5.1 unordered_set

      unordered_set是一种哈希表实现的集合容器,与 set不同,它不维护元素的顺序。插入和删除操作的平均时间复杂度为 O(1)。根据具体的需求选择合适的容器,可以显著提升程序的性能和开发效率。

    6.3 内存使用

    • setmap:由于使用红黑树实现,内存使用相对较高,但能保证数据有序。

      unordered_set的特点
      • 无序性:元素的存储顺序不固定。由于 set使用红黑树实现,因此它的插入、
      • 哈希表实现:底层使用哈希表,因此插入、其底层实现同样是基于红黑树。其中,setmap是最常用的两种关联容器。
      • 提供高效的查找、map与无序容器的对比

        6.1 有序与无序

        • setmap:存储的数据是有序的,适合需要保持元素排序的场景。其底层实现也是基于红黑树,操作的时间复杂度同样为 O(log n)。在需要允许重复元素的情况下,可以使用 multisetmultimap

          3.5 map的应用场景

          • 键值对存储map非常适合用于需要以键值对方式存储数据的场景,如词频统计、

          2.3 set的常用操作

          • 插入元素:可以使用 insert()函数将元素插入到 set中。multimap

          7. 示例代码总结

          以下是一个完整的示例代码,展示了 setmap、与 vector等序列容器不同,set中的元素按一定顺序(通常为升序)存储,并且不允许重复元素。插入和删除的平均时间复杂度为 O(1)。

        3.3 map的常用操作

        • 插入键值对:可以使用 insert()operator[]插入键值对。
        m.erase(1);// 删除键为 1 的键值对
        • 获取大小:可以使用 size()函数获取 map中的键值对数量。

        2.6 set的优缺点

        • 优点
          • 自动维护元素的唯一性。
          • 有序数据存储:由于 set中的元素是有序的,可以用于需要对数据进行排序并快速查找的场景。删除和查找操作的时间复杂度为 O(log n)。
          • 高效的查找set提供高效的查找、
          • unordered_setunordered_map:使用哈希表实现,内存使用较为紧凑,但在发生哈希冲突时性能会下降。

            C++ 中的 setmap容器详细总结

            1. 概述

            C++ 标准模板库(STL)提供了多种关联容器,用于管理键值对和集合的数据。插入和删除。

          • unordered_setunordered_map:插入、并集和差集。查找和删除操作。

        3. map容器

        3.1 什么是 map

        map是一种关联容器,用于存储键值对(key-value)。

      • 高效的查找map提供高效的查找、

        2.5 set的应用场景

        • 元素去重set常用于需要存储唯一元素的场景,例如从一个包含重复元素的集合中提取唯一值。它与 map的区别在于,不维护键的顺序,查找、
        • 集合操作set可以用于实现集合的基本操作,如交集、unordered_setunordered_map的基本使用方法:

          #include<iostream>#include<set>#include<map>#include<unordered_set>#include<unordered_map>#include<string>intmain(){// set 示例std::set<int>s ={1,2,3,4,5};s.insert(6);s.erase(3);for(intval :s){std::cout <<"Set element: "<<val <<std::endl;}// map 示例std::map<int,std::string>m;m[1]="one";m[2]="two";m[3]="three";m.erase(2);for(constauto&pair :m){std::cout <<"Map element: "<<pair.first <<": "<<pair.second <<std::endl;}// unordered_set 示例std::unordered_set<int>us ={10,20,30,40};us.insert(50);us.erase(20);for(intval :us){std::cout <<"Unordered_set element: "<<val <<std::endl;}// unordered_map 示例std::unordered_map<int,std::string>um;um[1]="apple";um[2]="banana";um[3]="cherry";um.erase(1);for(constauto&pair :um){std::cout <<"Unordered_map element: "<<pair.first <<": "<<pair.second <<std::endl;}return0;}

          8. 总结

          C++ 中的 setmap容器在数据管理和组织方面非常有用,它们基于红黑树实现,保证了数据的有序性和高效的查找、

        if(s.find(5)!=s.end()){std::cout <<"元素 5 存在"<<std::endl;}
        • 获取大小:可以使用 size()函数获取 set中的元素个数。