set(集合)、 map(映射表)、 multiset(多键集合) 、multimap(多键映射表),这些容器均以RB-tree完成(是一种比较均衡的二叉树);
hash_set(散列集合)、hash_map(散列映射表)、hash_multiset(散列多键集合)、hash_multimap(散列多键映射表)是以hashtable(散列表--一种链表数组)为底层机制完成。
这些关联式容器,类似关联式数据库,每笔数据或每个元素都有一个键值(key)和一个实值(value),即所谓的Key-Value(键-值对)。当元素被插入到关联式容器中时,容器内部结构(RB-tree/hashtable)便依照其键值大小,以某种特定规则将这个元素放置于适当位置。
set,同map一样,所有元素都会根据元素的键值自动被排序,因为set/map两者的所有各种操作,都只是转而调用RB-tree的操作行为,不过,值得注意的是,两者都不允许两个元素有相同的键值。
不同的是:set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值,而map的所有元素都是pair,同时拥有实值(value)和键值(key),pair的第一个元素被视为键值,第二个元素被视为实值。
至于multiset/multimap,他们的特性及用法和set/map完全相同,唯一的差别就在于它们允许键值重复,即所有的插入操作基于RB-tree的insert_equal()而非insert_unique()。
hash_set/hash_map,两者的一切操作都是基于hashtable之上。不同的是,hash_set同set一样,同时拥有实值和键值,且实质就是键值,键值就是实值,而hash_map同map一样,每一个元素同时拥有一个实值(value)和一个键值(key),所以其使用方式,和上面的map基本相同。但由于hash_set/hash_map都是基于hashtable之上,所以不具备自动排序功能。因为hashtable没有自动排序功能。
至于hash_multiset/hash_multimap的特性与上面的multiset/multimap完全相同,唯一的差别就是它们hash_multiset/hash_multimap的底层实现机制是hashtable(而multiset/multimap,上面说了,底层实现机制是RB-tree),所以它们的元素都不会被自动排序,不过也都允许键值重复。
所以,综上,说白了,什么样的结构决定其什么样的性质,因为set/map/multiset/multimap都是基于RB-tree之上,所以有自动排序功能,而hash_set/hash_map/hash_multiset/hash_multimap都是基于hashtable之上,所以不含有自动排序功能,至于加个前缀multi_无非就是允许键值重复而已。
相关推荐
在C++标准库中,模板被广泛应用于STL(Standard Template Library,标准模板库),其中包括了各种容器如vector、map、multimap、set和multiset。这些容器都是模板类,它们提供了高效的数据组织和操作方式。 1. **...
在海量数据处理中,set/map/multiset/multimap 等数据结构扮演着重要的角色。这些数据结构都内含一个 RB-tree 或 hashtable,用于存储和处理大量数据。set 是一种集合数据结构,map 是一种映射表数据结构,multiset ...
用AVL-tree数据结构作为底层机制,以STL底层空间配置器和iterator_traits编程技法实作出一个独立的关联式容器(map, set, multimap, multiset),并对外提供接口实现和STL完全兼容的容器。
与`std::set`不同的是,`std::multiset`允许插入重复的元素。 `std::multiset`是一种非常有用的容器,尤其是在处理需要保留重复项且希望保持元素有序的情况下。下面我们将详细介绍`std::multiset`的主要特性和用法...
Multiset ( 1 , 2 , 3 ) + Multiset ( 3 , 4 , 5 ) // == Multiset(1, 2, 3, 3, 4, 5) // Difference Multiset ( 1 , 2 , 3 ) - Multiset ( 2 , 3 ) // == Multiset(1) // Intersection Multiset ( 1 , 2 , 3 ) & ...
- 提供了与 Set/Map/Multiset/Multimap 类似的接口,但增删改查操作的时间复杂度接近 O(1)。 ### 三、图的基本操作 1. **建图**: - 通过邻接表存储图的结构。 - `h[k]` 存储第 `k` 个节点的邻接表的头结点。 ...
C++ multimap和map所支持的操作相同(除了multimap不支持下标运算),但是multimap允许重复的元素。 完整程序代码: /*请务必运行以下程序后对照阅读*/ ///头文件依旧是map #include <map> #include #include ...
它们提供了一些标准集合类不具备的功能,例如`Multiset`允许元素有多个计数值,`Multimap`则可以将一个键关联到多个值。 总的来说,Guava的`com.google.common.collect`包为Java开发者提供了一套强大的工具,能够...
与`set`不同的是,当插入相同的元素时,`multiset`会保留多个副本。 **二、multiset的基本操作** 1. **插入元素**: 使用`insert()`函数可以向`multiset`中插入一个或多个元素。例如: ```cpp std::multiset<int>...
multiset和multimap与set和map类似,但它们允许键或值的重复。这也就意味着,尽管它们也是基于红黑树,但插入和删除操作可能会涉及更多的节点调整,因为可能存在多个相同的键或键值对。 总的来说,STL中的map和set...
- **关联式容器**:每笔数据都有一个键(key)和一个值(value),常见的有关联式容器如`set`、`map`、`multiset`和`multimap`等。 #### 四、关联式容器详解 1. **基于红黑树的容器**:包括`set`、`map`、`...
容器是STL中用于存储数据的主要结构,如vector、deque、list、map/multimap、set/multiset等。它们各自有不同的特点和应用场景,例如vector适合动态数组的需求,deque提供两端的快速插入和删除,而list则通过双向...
关联式容器则包括set、map、multiset和multimap,这些容器内部结构通常使用红黑树(RB-tree)来完成。除此之外,hashtable(散列表)和基于hashtable实现的hash_set、hash_map、hash_multiset和hash_multimap也是...
`map`与其他关联容器如`multimap`、`set`和`multiset`之间可以通过成员函数`swap`或拷贝构造函数来进行转换。 **效率分析**: - 插入和查找操作的时间复杂度为O(log n),由于红黑树的特性,操作相对高效。 - 删除...
总之,C++中的`map`和`set`通过红黑树实现了高效的数据管理,提供了快速的查找、插入和删除操作,而它们的迭代器稳定性和与内存分配相关的特性与序列容器如`vector`有所不同。理解这些内部机制有助于编写更加高效和...
unordered_multiset map multimap unordered_map unordered_multimap algorithm 其它 实现自定义排序规则 Python 攻略 基本数据类型 生成器 文件操作 并发 三方库 jieba wordcloud Python 连接数据库 Web 开发 爬虫 ...