一、基本分类
容器名称 | 键(值对)是否唯一 | 是否有序 | 底层结构 |
---|---|---|---|
map | 是 | 是 | 红黑树 |
set | 是 | 是 | 红黑树 |
multimap | 否 | 是 | 红黑树 |
multiset | 否 | 是 | 红黑树 |
unordered_map | 是 | 否 | 哈希表 |
unordered_set | 是 | 否 | 哈希表 |
unordered_multimap | 否 | 否 | 哈希表 |
unordered_multiset | 否 | 否 | 哈希表 |
二、详细说明
(一)map
map是一个键值对(key – value)容器,key和value可以是任何数据类型,键是唯一的,按照键排序,底层是一颗红黑树,访问单个元素的速度为O(logN)。
1.定义
map<int, int> m;
map<int, bool> m;
map<string, bool> m;
2.下标访问
map<char, int> m;
m['a'] = 1;
cout << m['a'] << endl;
3.范围遍历
map<char, int> m;
for (int i = 1; i <= 26; i++)
m[i - 1 + 'a'] = i;
for (auto x : m)
cout << x.first << ' ' << x.second << endl;
4.常用函数
m.clear(); // 清空容器
cout << m.size() << endl; // 返回容器大小
auto p = m.find(666); // 指向容器中key为666的元素,如果没有该key将返回end()迭代器
cout << p->second << endl; // 输出key为666的value
m.insert({5, 10}); // 在容器中插入key为5,value为10的元素
m.erase(p); // 删除迭代器指向的元素
auto p = m.lower_bound(x);//返回一个指向第一个大于等于 x 的元素的迭代器。若无,返回end()迭代器。
auto p = m.upper_bound(x); // 返回一个指向第一个大于 x 的元素的迭代器。若无,返回end()迭代器。
(二)set
集合,其特点是不会出现重复的内容,经常使用它去重,自动升序排序,底层是一颗红黑树,访问单个元素的速度为O(logN)。
1.定义
set<int> s;
set<string> s;
2.范围遍历
set<int> s;
for (int i = 1; i <= 10; i++)
s.insert(i * 15); // 在集合中插入一个元素
for (auto x : s)
cout << x << endl;
3.降序排序
set<int, greater<int>> s;
4.常用函数
s.clear(); // 清空容器
cout << s.size() << endl; // 返回容器大小
auto p = s.find(666); // 指向容器中值为666的元素,如果没有该值将返回end()迭代器
s.insert(5); // 在容器中插入元素
s.erase(p); // 删除迭代器指向的元素
auto p = s.lower_bound(x);//返回一个指向第一个大于等于 x 的元素的迭代器。若无,返回end()迭代器。
auto p = s.upper_bound(x); // 返回一个指向第一个大于 x 的元素的迭代器。若无,返回end()迭代器。
(三)multimap
multimap 用法基本上和 map 是一样的,唯一的不同是:map 中的 key 是唯一的,而 multimap 中 key 是可以重复的。
1.定义
multimap<int, int> mm;
multimap<int, bool> mm;
multimap<char, int> mm;
multimap<string, int> mm;
(四)multiset
multiset 用法基本上和 set 是一样的,唯一的不同是:set 中的元素是唯一的,而 multimap 中元素是可以重复的。
1.定义
multiset<int> s;
multiset<string> s;
(五)unordered_map
unordered_map与map使用方法一致,底层是哈希表,访问单个元素的速度为O(1)。
1.定义
unordered_map<int, int> m;
unordered_map<int, bool> m;
unordered_map<char, int> m;
unordered_map<string, int> m;
(六)unordered_set
unordered_set与set使用方法一致,底层是哈希表,访问单个元素的速度为O(1)。
1.定义
unordered_set<int> s;
unordered_set<string> s;
(七)unordered_multimap
unordered_multimap与unordered_map使用方法一致,唯一的不同是:unordered_map 中的 key 是唯一的,而 unordered_multimap 中 key 是可以重复的。
1.定义
unordered_multimap<int, int> m;
unordered_multimap<int, bool> m;
unordered_multimap<char, int> m;
unordered_multimap<string, int> m;
(八)unordered_multiset
unordered_multiset与unordered_set使用方法一致,唯一的不同是:unordered_set 中的元素是唯一的,而 unordered_multiset 中元素是可以重复的。
1.定义
unordered_multiset<int> s;
unordered_multiset<string> s;