内部都由红黑树实现
有序哈希表 有序不可重复哈希表(映射)map这里专栏里其他文章提到的函数(方法)就不会再说
参考:cplusplus
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less, // map::key_compare
class Alloc = allocator > // map::allocator_type
> class map;
属性:映射是关联容器,它按照特定顺序存储由键值和映射值组合形成的元素。
在映射中,键值通常用于对元素进行排序和唯一标识,而映射值存储与该键关联的内容。键和映射值的类型可能不同,并在成员类型 value_type 中组合在一起;
typedef pair
value_type; 在内部,映射中的元素总是按照其内部比较对象(类型比较)指示的特定严格弱排序标准按其键排序。map与multimap红黑树(高度平衡树)实现的
map 容器通常比 unordered_map 容器通过它们的键访问单个元素慢,但它们允许根据它们的顺序直接迭代子集。
映射通常被实现为二叉搜索树。
参数:关联容器中的元素通过它们的键而不是它们在容器中的绝对位置来引用。
容器中的元素始终遵循严格的顺序。 所有插入的元素都按此顺序指定一个位置。
每个元素都将一个键与映射值相关联:键用于标识主要内容是映射值的元素。
容器中没有两个元素可以具有等效键。
容器使用分配器对象来动态处理其存储需求。
key: 键值类型
T: 元素类型
compare:比较类型
Alloc:分配器
1、构造函数参数 key_compare是比较函数
| empty (1) | explicit map (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); |
|---|---|
| range (2) | template |
| copy (3) | map (const map& x); |
下表的classcomp又称伪函数
// constructing maps #include2、std::map::equal_range#include
pair2.1功能equal_range (const key_type& k) const; pair equal_range (const key_type& k);
返回一个范围(迭代器)的边界,该范围包括容器中具有等效于 k 的键的所有元素。如果未找到匹配项,则返回的范围长度为零,两个迭代器都指向根据容器的内部比较对象 (key_comp) 被认为在 k 之后的第一个具有键的元素。
2.2参数要搜索的键。
2.3返回值pair第一个迭代器是范围的左边界与lower_bound一样 ,第二个迭代器是右边界upper_bound 一样[iterator,iterator)
函数返回一个pair,其成员pair::first 是范围的下界(与lower_bound 相同),pair::second 是上界(与upper_bound 相同)。如果映射对象是 const 限定的,则该函数返回一对 const_iterator。 否则,它返回一对迭代器。成员类型 iterator 和 const_iterator 是指向元素(类型 value_type)的双向迭代器类型。请注意,map 容器中的 value_type 本身也是一个对类型:pair
// map::equal_range #include3、std::map::erase#include
| (1) | iterator erase (const_iterator position); |
|---|---|
| (2) | size_type erase (const key_type& k); |
| (3) | iterator erase (const_iterator first, const_iterator last); |
从地图容器中删除单个元素或一系列元素 ([first,last))。这通过移除的元素数量有效地减小了容器的大小,这些元素被销毁了。
3.2参数position:指向要从地图中删除的单个元素的迭代器。
K: 要从地图中删除的元素的键。成员类型 key_type 是容器中元素的类型,在 map 中定义为其第一个模板参数(Key)的别名。
first, last:迭代器指定要删除的地图容器内的范围:[first,last)。 即范围包括 first 和 last 之间的所有元素,包括 first 指向的元素但不包括 last 指向的元素。成员类型 iterator 和 const_iterator 是指向元素的双向迭代器类型。
3.3返回值对于基于键的版本 (2),该函数返回擦除的元素数。成员类型 size_type 是无符号整数类型。 其他版本返回一个迭代器,指向最后一个被移除元素(或 map::end,如果最后一个元素被移除)之后的元素。
// erasing from map #include4、std::map::find#include
iterator find (const key_type& k); const_iterator find (const key_type& k) const;4.1功能
在容器中搜索具有与 k 等价的键的元素,如果找到则返回一个迭代器,否则返回一个迭代器到 map::end。另一个成员函数 map::count 可用于仅检查特定键是否存在。
4.2参数K:要搜索的键。成员类型 key_type 是容器中元素的键类型,在 map 中定义为其第一个模板参数 (Key) 的别名。
4.3返回值如果找到具有指定键的元素,则为元素的迭代器,否则为 map::end。
// map::find #include5、std::map::count#include
size_type count (const key_type& k) const;5.1功能
使用特定键计算元素 在容器中搜索键等于 k 的元素并返回匹配的数量。 由于地图容器中的所有元素都是唯一的,因此该函数只能返回 1(如果找到该元素)或零(否则)。 如果容器的比较对象反射性返回 false(即,无论键作为参数传递的顺序如何),则两个键被认为是等效的。
// map::count #include6、std::map::key_comp#include
key_compare key_comp() const;6.1功能:
6.2返回值返回容器用于比较键值的比较对象的副本。
比较对象。 成员类型 key_compare 是与容器关联的比较对象的类型,在 map 中定义为其第三个模板参数 (Compare) 的别名。
// map::key_comp #include7、std::map::insert#include
//single element (1) 单一元素插入 pair7.1功能insert (const value_type& val); template pair insert (P&& val); //with hint (2) 指定位置插入 iterator insert (const_iterator position, const value_type& val); template iterator insert (const_iterator position, P&& val); //range (3) //迭代器范围插入 template void insert (InputIterator first, InputIterator last); //initializer list (4) 列表初始化插入 void insert (initializer_list il);
插入新元素,并扩展容器大小
7.2参数val: 要复制到(或移动为)插入元素的值。
position:提示插入元素的位置,这只是一个提示,并不会强制将新元素插入到地图容器内的该位置(哈希表的元素始终遵循特定的顺序,具体取决于它们的键)。
first,last: 指定元素范围的迭代器。 范围 [first,last) 中元素的副本被插入到容器中。注意,范围包括 first 和 last 之间的所有元素,包括 first 指向的元素但不包括 last 指向的元素。函数模板参数 InputIterator 应该是一个输入迭代器类型,它指向可以构造 value_type 对象的类型的元素。
7.3返回值il: 一个 initializer_list 对象。 插入这些元素的副本。这些对象是从初始化列表声明符自动构造的。成员类型 value_type 是包含在容器中的元素的类型,在 map 中定义为 pair
单元素版本返回新插入的键值对,其成员 pair::first 设置为指向新插入元素或映射中具有等效键的元素的迭代器。 如果插入了新元素,则pair::second 元素设置为true,如果等效键已经存在,则设置为false。其余版本返回一个迭代器,该迭代器指向新插入的元素或映射中已经具有等效键的元素
// map::insert (C++98) #include8、std::map::lower_bound、std::map::upper_bound#include
iterator lower_bound (const key_type& k); const_iterator lower_bound (const key_type& k) const;8.1功能
lower_bound:返回指向小于等于K键值(KEY最大的那个)的处的迭代器,与算法的lower_bound功能一样,但用类内部的一般要比外部的快
8.2参数upper_bound: 返回指向大于K键值(KEY最小的那个)的处的迭代器,与算法的lower_bound功能一样,但用类内部的一般要比外部的快
8.3返回值k: 要查找的键。
迭代器类型
// map::lower_bound/upper_bound #include9、std::map::operator=#include
//copy (1) map& operator= (const map& x); //move (2) map& operator= (map&& x); //initializer list (3) map& operator= (initializer_list9.1功能il);
9.2参数将新内容分配给容器,替换其当前内容。
x: 要赋值的同种类型的对象(x理解为被赋值)
9.3返回值y: 列表初始化对象
this指针的解引用
// assignment operator with maps #include10、std::map::operator[]#include
mapped_type& operator[] (const key_type& k); mapped_type& operator[] (key_type&& k);10.1功能
10.2参数通过键值直接获取value,若该键值不存在,直接插入,如果 k 与容器中任何元素的键都不匹配,则该函数会插入一个具有该键的新元素并返回对其映射值的引用。 注意,即使没有为元素分配映射值(元素是使用其默认构造函数构造的),这始终会将容器大小增加 1。
k:key
10.3返回值对具有等效于 k 的键值的元素的映射值的引用。
// accessing mapped values #include11、std::map::swap#include
void swap (map& x);11.1功能
用 x 的内容交换容器的内容,这是另一个同类型的映射。 尺寸可能不同。调用此成员函数后,此容器中的元素为调用前x 中的元素,x 中的元素为this 中的元素。 所有迭代器、引用和指针对交换的对象仍然有效。
// swap maps #include有序可重复哈希表multimap#include
1、key不重复,value可重复,按key的的顺序存储,严格按照弱序排列,即从小到大这里主要讲讲和map的区别部分
2、无[]直接访问元素、无at()在内部,multimap 中的元素总是按照其内部比较对象(类型比较)指示的特定严格弱排序标准按其键排序。相同key值按照插入顺序排列
其余的就都和map类似了,只有些许不同,具体细节multimap
有续集set1、相当于只有value,且value不可重复,按value的的顺序存储,严格按照弱序排列,即从小到大,且所存储的值不可修改(常量)这里主要讲讲和map的区别部分
2、无[]直接访问元素、无at()在内部,set中的元素总是按照其内部比较对象(类型比较)指示的特定严格弱排序标准按其键排序。
其余的就都和map类似了,只有些许不同,具体细节set
可重复有续集multiset 1、相当于只有value,且value可重复,按value的的顺序存储,严格按照弱序排列,即从小到大,且所存储的值不可修改(常量)2、无[]直接访问元素、无at()在内部,multiset中的元素总是按照其内部比较对象(类型比较)指示的特定严格弱排序标准按其键排序。相同key值按照插入顺序排列
其余的就都和map类似了,只有些许不同,具体细节multiset - C++ Reference (cplusplus.com)



