本周老师讲解了关联容器map和set、STL的整体结构、仿函数、非变异的泛型算法等。但是这些内容均为C++98的内容,不包括C++11新增的无序管理容器、foward_list和array容器。本文主要讲述C++11新增的无序关联容器的用法。
C++11新增了4中无序关联容器,分别为unordered_set, unordered_map, unordered_multiset, unordered_multimap。这些容器与之前有序容器最大的差别在于,这些容器使用哈希函数+关键字==操作符来组织元素。因此,要使用无序关联容器来组织元素的话,必须保证容器元素已经实现==操作符。
由于无序关联容器在组织元素时用到哈希函数因此理论上性能会比有序关联容器要高,因此在维护有序位序代价较高的场合或者实际证明使用哈希函数可以显著提高性能的场合都可以优先考虑使用无序关联容器。
无序关联容器的接口和有序关联容器在插入元素、查找元素、删除元素和遍历元素都和有序容器一样。下面的代码列举了无序关联容器的使用方法。
void word_counter()
{
ifstream fin("E:\\cppworkspace\\HelloWorld\\src\\ref_container.cpp");
string buf;
istream_iterator<char> iter(fin);
istream_iterator<char> eof;
unordered_map<string, size_t> words_map;
set<char> exclude = {',', '.', '?', '<', '>', ':', '(', ')', '[', ']', '&', '-', '{', '}', ' ', '\t', '=', '\n', '\r', ';', '+', '!', '/', '*', '"', '#', '\\'};
while(iter != eof){
if (exclude.find(*iter) == exclude.end()){
buf.push_back(tolower(*iter));
}else{
if (!buf.empty()){ /*buf has content, it's a word*/
words_map[buf]++;
buf.clear();
}
}
iter++;
}
for(auto &p:words_map){
cout << p.first << " Occure " << p.second << " time(s) " << endl;
}
}
无序关联容器还提供了一组桶管理操作,函数接口如下:
*桶访问接口*
begin() - 返回一个迭代器,指向指定的桶的开始
end() - 返回一个迭代器,指向指定的桶的末尾
bucket_count() - 返回桶的数量
max_bucket_count() - 返回桶的最大数量
bucket_size() - 返回在特定的桶中的元素数量
bucket(key) - 返回带有特定键的桶
*哈希策略*
load_factor - 返回每个桶的平均元素数量
max_load_factor - 管理每个桶的平均元素数量的最大值
rehash - 为至少为指定数量的桶预留存储空间。这会重新生成哈希表。
参考资料:
1.cpp primer 5th