linux c++库boost中unordered_map是基于hash的无序集合,每一个元素包括是由成对的key和value组成。如何插入数据及实现unordered_map的快速查找呢?插入数据使用 insert方法,查找则使用find方法,find方法返回unordered_map的iterator,如果返回为end()表示未查找到,否则表示查找到。boost::unordered_map是计算元素的hash值,根据hash值判断元素是否相同。所以,对unordered_map进行遍历,结果是无序的。
boost库中unordered_map定义如下:
template <
class Key, class Mapped,
class Hash = boost::hash<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<Key> >
class unordered_map;
下面的代码给出了一个示例:
#include "stdio.h"
#include <iostream>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <utility>
#include <boost/lexical_cast.hpp>
using namespace std;
using namespace boost;
// g++ -o test_unordered_map test_unordered_map.cpp -std=c++0x
int main(int argc,char *argv[])
{
unordered_map<string,int> mymap;
unordered_map<string,int>::iterator it;
for(int i=0;i<100;i++)
{
try
{
mymap[lexical_cast<string>(i)]=i;
}
catch(bad_lexical_cast &)
{
printf("lexical_cast<string>(i) error!");
}
}
for(int i=90;i<110;i++)
{
try
{
it=mymap.find(lexical_cast<string>(i));
printf("%drn",(it==mymap.end()));
}
catch(bad_lexical_cast &)
{
printf("lexical_cast<string>(i) error!");
}
}
return 0;
}
再附加一段来自网上的示例代码供参考:
#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;
}