这篇文章说的比较精髓,所以就原文转过来了。
stl中的map基于红黑树实现,并且在insert元素的时候,通过operator<来比较元素以及找到可以插入元素的位置,因此最终遍历结果有序。
而boost中unordered_map是基于哈希值来比较元素的,有的元素可能哈希值相同但元素不同,因此需要先定义hash_value函数以及operator==。因此遍历unordered_map的结果是无序的。
#include<string>
#include<iostream>
#include<map>
#include<stdio.h>
#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 this->age < p.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;
}
map<person,int> m;
boost::unordered_map<person,int> um;
int main()
{
person p1("p1",20);
person p2("p2",22);
person p3("p3",22);
person p4("p4",23);
person p5("p5",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));
um.insert(make_pair(p3, 100));
um.insert(make_pair(p4, 100));
um.insert(make_pair(p5, 100));
um.insert(make_pair(p1, 100));
um.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;
}
cout<<endl;
for(boost::unordered_map<person, int>::iterator iter = um.begin(); iter != um.end(); iter++)
{
cout<<iter->first.name<<"\t"<<iter->first.age<<endl;
}
cout<<(m.find(p3)!=m.end())<<endl;
return 0;
}
output:
p1 20
p3 22
p4 23
p5 24
p3 22
p1 20
p5 24
p4 23
p2 22
0
stl::map中p2与p3的age相同导致p2找不到插入位置,最终map里没有p2这个人。