map、set、unordered_set、unordered_map

本文介绍了C++中unordered_set和set容器的底层实现(红黑树和哈希表),包括它们的初始化方式、有序与无序特性、查找、插入、删除操作,以及multiset的独特之处。同时讨论了如何使用迭代器遍历和set中的自定义类型存储。
摘要由CSDN通过智能技术生成

类似于map/unordered_mapsetunordered_set底层分别是用红黑树和哈希表实现的。

初始化方法

unordered_set<int> s1;  // 不带任何参数
unordered_set<int> s2 {1, 3, 5, 7};  // 初始集合元素
set<string> s3 {"abcc", "123", "978"};
unordered_set<string> s4(s3.begin(), s3.end());  // 复制
set<string, greater<>> s5;  // 默认是从小到大排序,这里变成从大到小排序

初始化的时候,可以指定初始的集合元素。set是一个有序容器,因此可以设置元素排序的方式。

常用方法

setmapunordered_setunordered_map在一些命令上非常相似。

查找:

s2.find(2) != s2.end() 如果元素不存在,find方法是会返回指向末尾的迭代器的(即.end()

插入:

s2.insert(2) 插入就是用insert了。

删除:

s2.erase(2) 或者 s2.erase(s2.find(2)) ,意思就是把迭代器作为参数传递进去。 该方法返回之后的迭代器。

集合其实最重要的就是查找、插入、删除三种操作了。

传入数/迭代器在 set里结果是一样的,但是 multiset里就不一样了。在 multiset里删除一个数的一次出现要使用迭代器!否则会全部删除。

遍历:

unordered_set是无序容器,但是也支持迭代器遍历。 set是有序容器所以遍历的时候需要注意顺序。 除此以外集合的变量与其他容器的变量没什么不同。

此外,set还支持upper_boundlower_bound函数,其使用方法跟map的基本相同。故在此省略。

有时候我们会想用集合来保存数组,就像python的集合可以储存元组一样,但是C++不行,unordered_set不能用来保存pair<int, int>,但是set可以。因为unordered_set是基于哈希的,而C++并没有给pair事先写好哈希方法。set是基于比较的树结构,所以pair里的数据结构只要都支持比较就能储存。

unordered_set<int> us {1, 2, 3, 4};
for (auto it = us.begin(); it != us.end(); it++) {
    cout << *it;
}

虽然我们会用上述的方式进行迭代,但是并不代表us.end() - us.begin()这个表达式是有效的。 有时候我们会:

set<int> s {1, 2, 3, 4};
int dist = distance(s.upper_bound(1), s.end());

使用distance函数计算

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值