stl::map與boost::unordered_map的區別

這篇文章說的比較精髓,所以就原文轉過來了。

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這個人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章