基本用法
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
unordered_xxx
的用法和xxx
的用法基本相同multi_xxx
和xxx
的用法基本相同
set基本用法
set<int> A;
set<int, less<int> > A;
string s1[N] = {"buffoon", "thinkers", "for", "heavy", "can", "for"};
set<string> A(s1, s1+N);
A
中的元素是惟一的
且已经进行了排序
set_union(A.begin(), A.end(), B.begin(), B.end(), insert_iterator<set<string> >(C, C.begin()));
low_bound()
将键作为参数并返回一个迭代器,该迭代器指向集合中第一个不小于键参数的成员。upper_bound()
将键作为参数并返回一个迭代器,该迭代器指向集合中第一个不大于键参数的成员。
string s("tennis");
A.insert(s);
B.insert(A.begin(), A.end());
A.erase(s);
A.count('a');
A.find('a') == A.end();
vector<int> nums{ 1, -1, -1};
unordered_multiset<int> m_multiset{ nums.begin(), nums.end() };
for (int i = 0; i < nums.size(); i++)
{
cout << "find key" << nums[i] << endl;
for (auto iter = m_multiset.find(nums[i]); iter != m_multiset.end(); iter++)
{
cout << *iter << endl;
}
}
find
只能告知该键是否存在,以及该键值所在的位置- 如果存在多个
key
相同的key-value
,不能使用find
返回的迭代器直接遍历到end()
,它只是告知你该key
在hash
表底层数据结构中的位置,并不保证从该位置到end()
之间的key
都是你要找的key
vector<int> nums{ 1, -1, -1 };
unordered_multiset<int> m_multiset{ nums.begin(), nums.end() };
for (int i = 0; i < nums.size(); i++)
{
cout << "find key" << nums[i] << endl;
for (auto iter = m_multiset.find(nums[i]); iter != m_multiset.end() && *iter == nums[i]; iter++)
{
cout << *iter << endl;
}
}
pair基本用法
pair
类型不是关联容器,而是一个键-值对
,一般用于key-value
的关联容器
pair<int, char> item1 {1, 'a'};
make_pair(1, 'a');
cout<<item1.first<<endl;
cout<<item1.second<<endl;
map基本用法
map<int, char> my_map;
my_map[1] = 'a';
pair<int, char> item(2, 'b');
my_map.insert(item);
my_map.insert(pair<int, char> (3, 'c'));
my_map.insert(make_pair(4, 'd'));
my_map.insert({5, 'e'});
multimap
与map
初始化方式相同,但key
重复不会被覆盖
map<int, char> m_map{{1, 'a'},{2, 'b'},{3, 'c'},{3, 'd'}};
multimap<int, char> m_multiset {{1, 'a'},{2, 'b'},{3, 'c'},{3, 'd'}};
my_map.count(2);
auto iter = my_map.find(2);
if(iter != my_map.end())
for(auto iter = my_map.begin(); iter != my_map.end(); iter++)
{
cout << iter->first << " "<<iter->second<<endl;
}
multi_xxx和xxx的区别
multimap
的用法与map
的用法基本相同,但multimap可以插入多个键
相同而值
不同的键值对
multimap<int, char> my_multimap;
my_multimap.insert({ 5, 'a' });
my_multimap.insert({ 5, 'b' });
my_multimap.insert({ 5, 'c' });
auto range_pair = my_multimap.equal_range(5);
for (auto iter = range_pair.first; iter != range_pair.second; iter++)
{
cout << iter->first << " " << iter->second << endl;
}
unordered_xxx和xxx的区别
unordered_set/unordered_multiset
vsset/multiset
:
- 无序关联容器
unordered_set/multiset
,由于底层使用hash table
因此会增加一些hash_table
相关的接口,但基本不会被使用 set/multiset
会按键的大小进行排序,而unordered_set/unordered_mutiset
不会进行排序set/multiset
提供了rbegin
和rend
方法,而unordered_set
和unordered_mutiset
未提供
multiset<int> m_multiset{ 5, 3, 4, 4, 1, 2 };
unordered_multiset<int> m_Umultiset{ 5, 3, 4, 4, 1, 2 };
for (int key : m_multiset)
cout << key << " ";
cout << endl;
for (int key : m_Umultiset)
cout << key << " ";
cout << endl;
基本原理
有序关联容器
- 定义: 将
值
与键
关联在一起,并使用键
来查找值 - 优点: 提供了对元素的快速访问
- 关联容器允许插入新元素,但无法指定插入位置
- 种类:
set
、multiset
、map
、multimap
- 有序关联容器对容器内的元素按
key
进行排序 - 有序关联容器底层是基于
红黑树
结构实现的
| key-val组合 | key |
---|
key不可重复 | map | set |
key可重复 | multimap | multiset |
无序关联容器
- 定义: 将
值
与键
关联在一起,并使用键
来查找值 - 种类:
unordered_set
、unordered_multiset
、unordered_map
、unordered_multimap
- 无序关联容器不对容器内的元素进行排序
- 无序关联容器底层是基于哈希表实现的
| key-val组合 | key |
---|
key不可重复 | unordered_map | unordered_set |
key可重复 | unordered_multimap | unordered_multiset |
相关问题
- unordered_map和map的区别和应用场景的区别:
map
支持自动排序,底层为红黑树
,因此插入和查询的时间复杂度为
O
(
l
o
g
n
)
O(log^n)
O(logn),而unordered_map
底层为哈希表
,查询的时间复杂度为
O
(
1
)
O(1)
O(1)- 红黑树需要维护
父节点
、子节点
以及颜色信息,因此占用空间更高,而哈希表
维护时间与bucket桶
维护的链表长度有关 map
适用于有序数据的应用场景,而unordered_map
适用于高效查询的应用场景