首页IT科技std map取值(STL map与Boost unordered_map orzlzro的专栏 博客频道 CSDN.NET)

std map取值(STL map与Boost unordered_map orzlzro的专栏 博客频道 CSDN.NET)

时间2025-07-29 01:39:58分类IT科技浏览5648
导读:分类: C++ 2011-12-24 11:05 1182人阅读 评论(0 收藏 举报 今天看到boost::unordered_map...

分类:

C++

2011-12-24 11:05 1182人阅读 评论(0) 收藏 举报

今天看到

boost::unordered_map            , 它与 stl::map的区别就是                       ,stl::map是按照operator<比较判断元素是否相同        ,以及比较元素的大小         ,然后选择合适的位置插入到树中                。所以                      ,如果对map进行遍历(中序遍历)的话            ,输出的结果是有序的                    。顺序就是按照operator<

定义的大小排序       。

而boost::unordered_map是计算元素的Hash值      ,根据Hash值判断元素是否相同            。所以                     ,对unordered_map进行遍历                ,结果是无序的                     。

用法的区别就是   ,stl::map 的key需要定义operator<           。 而boost::unordered_map需要定义hash_value函数并且重载operator==        。对于内置类型                    ,如string                    ,这些都不用操心                      。对于自定义的类型做key,就需要自己重载operator<

或者hash_value()了             。

最后                ,说                        ,当不需要结果排好序时    ,最好用unordered_map    。

其实            ,stl::map对于与java中的TreeMap                       ,而boost::unordered_map对应于java中的HashMap                       。

stl::map

[cpp] view plaincopyprint?
#include<string> #include<iostream> #include<map> usingnamespacestd; structperson { stringname; intage; person(stringname,intage) { this->name=name; this->age=age; } booloperator<(constperson&p)const { returnthis->age<p.age; } }; map<person,int>m; intmain() { personp1("Tom1",20); personp2("Tom2",22); personp3("Tom3",22); personp4("Tom4",23); personp5("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>::iteratoriter=m.begin();iter!=m.end();iter++) { cout<<iter->first.name<<"\t"<<iter->first.age<<endl; } return0; }
#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 { 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; } return 0; }

output:

Tom1 20

Tom3 22

Tom4 23

Tom5 24

operator<的重载一定要定义成const                。因为map内部实现时调用operator<的函数好像是const。

由于operator<比较的只是age,所以因为Tom2和Tom3的age相同        ,所以最终结果里面只有Tom3         ,没有Tom2

boost::unordered_map

[cpp] view plaincopyprint?
#include<string> #include<iostream> #include<boost/unordered_map.hpp> usingnamespacestd; structperson { stringname; intage; person(stringname,intage) { this->name=name; this->age=age; } booloperator==(constperson&p)const { returnname==p.name&&age==p.age; } }; size_thash_value(constperson&p) { size_tseed=0; boost::hash_combine(seed,boost::hash_value(p.name)); boost::hash_combine(seed,boost::hash_value(p.age)); returnseed; } intmain() { typedefboost::unordered_map<person,int>umap; umapm; personp1("Tom1",20); personp2("Tom2",22); personp3("Tom3",22); personp4("Tom4",23); personp5("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::iteratoriter=m.begin();iter!=m.end();iter++) { cout<<iter->first.name<<"\t"<<iter->first.age<<endl; } return0; }
#include<string> #include<iostream> #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; boost::hash_combine(seed, boost::hash_value(p.name)); boost::hash_combine(seed, boost::hash_value(p.age)); return seed; } int main() { typedef boost::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

必须要自定义operator==和hash_value                    。 重载operator==是因为                      ,如果两个元素的hash_value的值相同            ,并不能断定这两个元素就相同      ,必须再调用operator==                    。

当然                     ,如果hash_value的值不同                ,就不需要调用operator==了    。
声明:本站所有文章   ,如无特殊说明或标注                    ,均为本站原创发布                。任何个人或组织                    ,在未征得本站同意时,禁止复制            、盗用                       、采集        、发布本站内容到任何网站         、书籍等各类媒体平台                    。如若本站内容侵犯了原著者的合法权益                ,可联系我们进行处理       。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
difference between individual(Difference between ArrayList and Vector in Java) jsf2.0(JSF 2 简介,第 1 部分: 流线化 Web 应用程序开发)