TBB容器模板类concurrent_hash_map的用法
2015-03-31 14:48
513 查看
concurrent_has_map是TBB中设计的符合stl规范的防止并发访问的hash table模板类,主要使用格式为:concurrent_hash_map<key, T, hashcompare>,其中 key和T是一键值对,而hashcompare则定义了hash值的产生和keys的比较。本文主要介绍该模板类的使用(下面是实现一个随机生成字符串数组存储的程序):
如下是一个自定义hashcompare结构体,该结构体定义了hash值的产生函数及两个关键key值的比较:
随机生成字符串函数如下(生成a-Z之间的字符,然后组成字符串):
如下是一个自定义hashcompare结构体,该结构体定义了hash值的产生函数及两个关键key值的比较:
struct MyHashCompare { static size_t hash(const string & x) { size_t h = 0; for ( const char* s= x.c_str(); *s; ++s) { h = (h*17)^*s; } return h; } static bool equal( const string & x, const string & y) { return x==y; } }; typedef concurrent_hash_map<string, int, MyHashCompare> StringTable;
随机生成字符串函数如下(生成a-Z之间的字符,然后组成字符串):
string generateRandomString() { char str[9]; char c1 = rand()%26 + 65; char c2 = rand()%26 + 65; char c3 = rand()%26 + 65; char c4 = rand()%26 + 65; char c5 = rand()%26 + 65; char c6 = rand()%26 + 65; char c7 = rand()%26 + 65; char c8 = rand()%26 + 65; sprintf(str, "%c%c%c%c%c%c%c%c",c1,c2,c3,c4,c5,c6,c7,c8); return string(str); }用StringTable进行输入数据处理的结构体:
struct Tally { StringTable& m_table; Tally(StringTable & table_):m_table(table_){} void operator()(const blocked_range<string*>range) const { for ( string* p = range.begin(); p!=range.end(); ++p) { StringTable::accessor a; m_table.insert(a, *p); a->second += 1; } } };测试例子:
void concurrent_hash_map_test() { tick_count t0 = tick_count::now(); const size_t N = 100000; string *Data = new string ; for ( int i=0; i<N; ++i) { Data [i] = generateRandomString(); } StringTable table; parallel_for(blocked_range<string*>(Data, Data+N, 100), Tally(table)); // printf("Table.size=%d\n", table.size()); int count = 0; for ( StringTable::iterator i= table.begin(); i!=table.end(); ++i) { printf("size=%d,%s %d\n",table.size(), i->first.c_str(), i->second); if ( i->second ==1 ) { count ++; } } printf("出现一次的个数:%d\n", count); tick_count t1 = tick_count::now(); printf("程序执行时间为:%g seconds\n", (t1-t0).seconds()); delete[]Data; // string str = generateRandomString(); // printf("%s", str.c_str()); }直接在main中调用该函数就可以运行了。在本例中,没有对concurrent_hash_map的结构或源码进行剖析,熟悉stl库的童鞋可以很轻松的应用该类,想了解更多的资料,可以查阅tbb源码或参考inel threading building blocks outfitting c++ for multi-core processor parallelisn。
相关文章推荐
- STL中map与hash_map容器的选择
- C++中的关联容器map用法
- dense_hash_map的复杂key的用法
- 三 关联式容器(五)hash_map与hash_multimap
- hash_map 自实现hash函数容器错误
- 【转】STL中map与hash_map容器的选择
- 标准C++中map容器的用法总结
- STL中map与hash_map容器的选择
- STL中map与hash_map容器的选择
- Java容器map的用法
- Map容器的用法(STL)
- C++ STL学习笔记十二 hash_map映照容器
- STL中map与hash_map容器的选择
- C++中的关联容器map用法
- STL--hash_map用法(2)
- STL中map与hash_map容器的选择
- Map容器的用法(STL)
- C++中hash_map和hash_set的用法
- 【语言-C++】C++容器:list、vector、hash、map的区别及使用范围
- C++中hash_map用法