map/set/multi_map/multi_set/unorder_map/unorder_set总结
来源:互联网 发布:淘宝微淘动态 编辑:程序博客网 时间:2024/06/16 04:36
map/set/multi_map/multi_sep底层实现是加头节点的红黑树,元素之间有序,当存放的是自定义类型的时候要重载operator<,中序遍历的时候是有序的。增删查的时间复杂度都是O(lgN)
map存放的是键值对<key,value>,,key唯一,value可以重复,不能修改key的值,可以先删除旧的值,再添加新的值,value的值可以修改。
set用户存放的是值,但是底层存放的仍能存放的是键值对,只不过key=value,同样的值是唯一的,不能随便修改value.
mulit_map/multi_set与map/set相比,大部分都是相同的,只是存放的元素可以不唯一,可以重复。
set代码:
#include<string> #include<iostream> #include<set> using namespace std;struct person { string name; int age; person(string name, int age) { this->name = name; this->age = age; } bool operator < (const person& p) const //key值比较{ return this->age < p.age; } }; int main() { set<person> m;person p1("Tom1",28); person p2("Tom2",23); person p3("Tom3",22); person p4("Tom4",20); person p5("Tom5",24); m.insert(p3); m.insert(p1); m.insert(p2); m.insert(p4);m.insert(p5); for(set<person>::iterator iter = m.begin(); iter != m.end(); iter++) { cout<<iter->name<<"\t"<<iter->age<<endl; } system("pause");return 0; }
map代码:
#include<string> #include<iostream> #include<map> using namespace std;struct person { string name; int age; person(string name, int age) { this->name = name; this->age = age; } bool operator < (const person& p) const //key值的比较。比较值唯一。{ return this->age < p.age; } }; map<person,int> m; int main() { person p1("Tom1",20); person p2("Tom2",22); person p3("Tom3",22); person p4("Tom4",23); person p5("Tom5",24); m.insert(make_pair(p3, 100)); m.insert(make_pair(p4, 100)); m.insert(make_pair(p5, 100)); m.insert(make_pair(p1, 100)); m.insert(make_pair(p2, 100)); for(map<person, int>::iterator iter = m.begin(); iter != m.end(); iter++) { cout<<iter->first.name<<"\t"<<iter->first.age<<endl; } system("pause");return 0; }
unordered_map/unordered_set底层实现用了哈希表,
(1)unordered_set存放的是value,unorder_map也是存储的key-value的值,可以通过key快速索引到value,但是不会根据key的大小进行排序,增删查的时间复杂度都是O(1)
(2)同样不能修改key值当存放的是自定义的元素类型的时候,需要定义hash_value函数并且重载operator==,重载operator==是因为,如果两个元素的通过哈希函数计算出的值相同,并不能断定这两个元素就相同,必须再调用operator==。
(3)散列值相同的被存储在一个桶里。当散列容器中有大量数据时,同一个桶里的数据也会增多,造成访问冲突,降低性能。为了提高散列容器的性能,unordered库会在插入元素是自动增加桶的数量,不需要用户指定。但是,用户也可以在构造函数或者rehash()函数中,指定最小的桶的数量
哈希表结构如下图:
#include<string> #include<iostream> #include<unordered_map> #include<boost/unordered_map.hpp>using namespace std; struct person { string name; int age; person(string name, int age) { this->name = name; this->age = age; } bool operator== (const person& p) const { return name==p.name && age==p.age; } }; size_t hash_value(const person& p) { size_t seed = 0; std::hash_combine(seed, std::hash_value(p.name)); std::hash_combine(seed, std::hash_value(p.age)); return seed; } int main() { typedef std::unordered_map<person,int> umap; umap m; person p1("Tom1",20); person p2("Tom2",22); person p3("Tom3",22); person p4("Tom4",23); person p5("Tom5",24); m.insert(umap::value_type(p3, 100)); m.insert(umap::value_type(p4, 100)); m.insert(umap::value_type(p5, 100)); m.insert(umap::value_type(p1, 100)); m.insert(umap::value_type(p2, 100)); for(umap::iterator iter = m.begin(); iter != m.end(); iter++) { cout<<iter->first.name<<"\t"<<iter->first.age<<endl; } return 0; }
结果:
Tom1 20
Tom5 24
Tom4 23
Tom2 22
Tom3 22
unordered_map/unordered_set 与map/set结论:
运行效率方面:unordered_map/unordered_set 最高,而map/set效率较低但 提供了稳定效率和有序的序列。
占用内存方面:map/set内存占用略低,unordered_map/unordered_set内存占用略高,而且是线性成比例的。
需要无序容器,快速查找删除,不担心略高的内存时用unordered_map;有序容器稳定查找删除效率,内存很在意时候用map。
- map/set/multi_map/multi_set/unorder_map/unorder_set总结
- map/set/multi_map/multi_set/unorder_map/unorder_set总结
- set/multiset/map/multimap/unorder_set/unorder_map
- unorder_map和map的区别。
- unorder_map
- Set List Map总结
- list map set总结
- set和map总结
- List、Set、Map总结!
- ES6 Map Set总结
- map&set学习总结
- LIST、MAP、SET总结
- List、Set、Map总结
- Set,Map学习总结
- list、set、map的总结
- list ,set,map 学习总结
- Java List Set Map 总结
- 20160125--集合Set-Map+总结
- Ajax概念介绍(同步和异步,XMLHttpRequest 对象,ajax-http请求,MLHttpRequest发送请求,XMLHttpRequest取得响应)
- 输入一个多位数,将这个数每一位相乘,再将积继续上一步操作,求经过几次操作后,积变成一位数?
- 导致虚拟机无法连接网络以及ping不通主机的原因
- [bzoj1934][SHOI2007] Vote 善意的投票 最小割
- jQuery事件绑定
- map/set/multi_map/multi_set/unorder_map/unorder_set总结
- jquery---组件高效的数字滚动特效
- css动画
- 使用Jadx反编译apk
- 【LeetCode】41. First Missing Positive
- Spring整合Dubbo对外提供服务
- POJ 1259 The Picnic 笔记
- 使用jquery.fullpage.js需要动态改变导航小圆点的样式
- could not reserve enough space for object heap