概述
简述
- 在关联容器中,对象的位置取决于和它关联的键的值
- 键可以是基本类型,也可以是类类型
map
- map容器的元素是
pair<const K,T>
类型的对象,这种对象封装了一个T类型的对象和一个与其关联的K类型的键 - 不允许有重复的键,可以保存重复的对象
- 容器中的元素都是有序的,默认使用
less<K>
比较
multimap
- 和map不同的是,允许使用重复的键
unordered_map
unordered_map<K,T>
中pair<const K,T>
元素的顺序并不是直接由键值确定的,而是由键值的哈希值确定的- 哈希值是由一个叫做哈希的过程生成的整数
- 不允许有重复的键
unordered_multimap
- 和unordered_map不同的是,允许有重复的键
set
- 对象唯一,元素有序
multiset
- 可以保存重复对象
unordered_set
- 对象唯一,元素位置由哈希值决定
unordered_multiset
- 可以保存重复对象
map
1 2 3 4 5 |
std::map<std::string, size_t> people; std::map<std::string, size_t> people1 {{"aet", 28}, {"aaa", 38}, {"bbb", 20}}; std::map<std::string, size_t> people2 { std::make_pair("a", 11), std::make_pair("b", 22)}; |
insert
1 2 3 |
std::map<std::string, size_t> people { std::make_pair("a", 11), std::make_pair("b", 22)}; auto pr = std::make_pair("aet", 10); people.insert(pr); |
count
- 可能返回0或1
1 |
auto count = people.count("test"); |
emplace
- 在适当的位置直接构造新元素,从而避免复制和移动操作
emplace_hint
- 在适当的位置直接构造新元素,从而避免复制和移动操作
- 第一个参数指定元素生成的位置
erase
- 移除键和参数匹配的元素
- 返回所移除元素的个数
make_pair<>()
- 显示参数决定了返回的pair对象的类型,会返回一个
pair<iterator,bool>
对象- 对象成员的first是一个迭代器,要么指向插入元素,要么指向阻止插入的元素
- 对象成员second(是一个bool)是返回对象,如果插入成功,返回true,否则返回false
1 2 3 4 5 6 7 |
ret = people.insert(std::make_pair("test", 11)); // 插入失败 if (!ret.second) { // test-11 std::cout << ret.first->first << "-" << ret.first->second << std::endl; } |
tuple
- 是pair模板的泛化,但允许定义tuple模板的实例,可以封装不同类型的任意数量的对象,因此tuple实例可以有任意数量的模板类型参数
forward_as_tuple
- 一个定义在tuple头文件中的模板函数
- 可以为不支持拷贝或移动运算符的T1和T2类型提供了在适当位置生成
pair<T1,T2>
对象
1 2 |
int a{1}, b{2}; const auto& c = std::forward_as_tuple(a, b); |
make_tuple
1 |
auto my_tuple = std::make_tuple(Name{"aet", "lif"}), 42, std::string("good")); |
get<>()
- 参数是size_t类型,表示tuple中元素的索引
1 |
std::cout << std::get<>(1) << std::endl; |
tie<>()
1 2 3 4 5 |
Name name(); size_t age{}; std::string phone{}; std::tie(name, age, phone) = my_tuple; |
multimap
insert
- 插入一个或多个元素,而且插入总是成功
- 返回指向插入元素的迭代器
emplace
- 在容器适当位置构造元素
emplace_hint
- 尽可能的在第一个参数指向的元素前面插入生成一个元素
equal_range
- 返回一个封装了两个迭代器的pair对象,这两个迭代器所确定的范围内的元素的键和参数值相等
lower_bound
- 返回一个迭代器,指向键值和参数相等或大于参数的第一个元素,或者指向结束迭代器
upper_bound
- 返回一个迭代器,指向键值大于函数参数的第一个元素,没有这样的元素的话,就返回一个结束迭代器
count
- 返回有多少个元素的键和给定的键相同
unordered_map
- 键唯一,元素无序
- 一般情况下,元素被保存在哈希表中,这个表中的条目被称为格子,每个格子可以包含几个元素
- 一个给定的哈希值会选择特定的格子,因为哈希值可能的个数几乎可以肯定会大于格子的个数,两个不同的哈希值可能会映射到同一个格子上。
- 因此,不同键会产生相同的哈希值,所以会产生碰撞,而且两个不同的哈希值选择相同的格子也会产生碰撞
- 影响元素存储管理的因素:
- 容器中格子的个数有一个默认值,但也可以指定初始个数
- 载入因子是每个格子平均保存的元素的个数。这个值等于容器中元素的个数除以格子的个数
1 2 3 4 |
std::unordered_map<std::string, size_t> people{{"aet", 22}}; // 指定应该分配的格子数量 std::unordered_map<std::string, size_t> people1{{"aet", 22}, 10}; |
rehash
- 改变格子的数量
max_load_factor
- 增加最大载入因子(每个格子所包含的元素的个数)
insert
emplace
- 在适当的位置生成对象,返回一个包含迭代器和布尔值的pair对象
emplace_hint
at
- 返回参数所关联对象的引用,如果键不存在,会抛出一个out_of_range的异常
erase
- 移除元素
clear
- 移除所有元素
unordered_multimap
- 一个允许有重复键的无序map
insert
emplace
emplace_hint
at
哈希
- 哈希是用给定范围内的基本类型的数据项,或者用string这样的对象,生成整数值的过程
- 哈希产生的值叫做哈希值或哈希码
- 产生重复的哈希值叫碰撞
1 2 3 4 |
std::hash<int> hash_int; std::vector<int> n {1, 2, 3, 4, 5}; std::transform(std::begin(n), std::end(n), std::ostream_iterator<size_t>(std::cout, " "), hash_int); |
set
- 内部元素的组织方式和map一样,都是平衡二叉树
1 |
std::set<int> numbers {1, 2, 3, 4, 5}; |
insert
emplace
emplace_hint
erase
clear
empty
size
max_size
- 存储的最大元素个数
find
- 返回一个和参数匹配的元素的迭代器
无
- at
multiset
1 |
std::multiset<std::string, std::greater<std::string>> words {{"one", "two", "three"}, std::greater<std::string>()}; |
insert
emplace,emplace_hint
- 总是成功
find
equal_range
lower_bound
upper_bound
count
unordered_set
insert
emplace,emplace_hint
find
equal_range
clear
erase
unordered_multiset
emplace,emplace_hint
erase
clear
max_load_factor
集合运算
并集
- set_union
1 2 3 4 5 6 7 |
std::vector<int> set1 { 1, 2, 3, 4, 5}; std::vector<int> set2 { 1, 2, 3, 4, 6}; std::vector<int> result; std::set_union(std::begin(set1), std::end(set1), std::begin(set2), std::endl(set2), std::back_inserter(result)); |
交集
- set_intersection
差集
- set_difference
对称差集
- set_symmetric_difference
比较两个集合
- includes
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 51CTO:C++语言高级课程三08/15
- ♥ COM组件_207/22
- ♥ Pybind11记述:一07/04
- ♥ Boost 程序库完全开发指南:函数并发08/25
- ♥ C++标准库_chrono03/28
- ♥ 51CTO:C++网络通信引擎架构与实现一09/09