底层机制及其应用场景
发布时间:2025-06-24 17:26:42 作者:北方职教升学中心 阅读量:882
在红黑树中,元素按照键值自动排序,因此 set
的插入操作不仅将元素添加到集合中,还会自动维护元素的顺序。本文将详细介绍 set
和 map
容器的特点、
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 时间复杂度
set
和map
:插入、
if(m.find(2)!=m.end()){std::cout <<"键 2 存在,值为: "<<m[2]<<std::endl;}
- 删除元素:可以使用
erase()
函数删除指定的键值对。unordered_map
的特点- 无序性:键的存储顺序不固定。如果对元素的顺序没有要求且更关心操作效率,可以选择无序容器
unordered_set
和unordered_map
。
3.6
map
的优缺点- 优点:
- 键唯一且有序,能够自动排序。
- 无法通过下标访问元素。
ms.erase(10);// 删除所有值为 10 的元素
4.2
multimap
multimap
是map
的变种,允许多个相同的键映射到不同的值。插入和删除操作,时间复杂度为 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_set
和unordered_map
:存储的数据是无序的,适合只关心快速查找和插入的场景。- 有序性:
map
中的键按一定顺序(默认升序)存储,用户可以自定义排序规则。插入和删除操作。
5.2 unordered_map
unordered_map
是一种基于哈希表实现的关联容器,存储键值对,键是唯一的。
map
提供高效的查找机制,适合用于需要根据键快速查找对应值的场景。4. multiset
和 multimap
4.1 multiset
multiset
是 set
的变种,允许存储重复的元素。插入和删除操作,时间复杂度为 O(log n)。