本周老師講解了關(guān)聯(lián)容器map和set、STL的整體結(jié)構(gòu)、仿函數(shù)、非變異的泛型算法等。但是這些內(nèi)容均為C++98的內(nèi)容,不包括C++11新增的無序管理容器、foward_list和array容器。本文主要講述C++11新增的無序關(guān)聯(lián)容器的用法。
C++11新增了4中無序關(guān)聯(lián)容器,分別為unordered_set, unordered_map, unordered_multiset, unordered_multimap。這些容器與之前有序容器最大的差別在于,這些容器使用哈希函數(shù)+關(guān)鍵字==操作符來組織元素。因此,要使用無序關(guān)聯(lián)容器來組織元素的話,必須保證容器元素已經(jīng)實(shí)現(xiàn)==操作符。
由于無序關(guān)聯(lián)容器在組織元素時(shí)用到哈希函數(shù)因此理論上性能會(huì)比有序關(guān)聯(lián)容器要高,因此在維護(hù)有序位序代價(jià)較高的場(chǎng)合或者實(shí)際證明使用哈希函數(shù)可以顯著提高性能的場(chǎng)合都可以優(yōu)先考慮使用無序關(guān)聯(lián)容器。
無序關(guān)聯(lián)容器的接口和有序關(guān)聯(lián)容器在插入元素、查找元素、刪除元素和遍歷元素都和有序容器一樣。下面的代碼列舉了無序關(guān)聯(lián)容器的使用方法。
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;
}
}
無序關(guān)聯(lián)容器還提供了一組桶管理操作,函數(shù)接口如下:
*桶訪問接口*
begin() - 返回一個(gè)迭代器,指向指定的桶的開始
end() - 返回一個(gè)迭代器,指向指定的桶的末尾
bucket_count() - 返回桶的數(shù)量
max_bucket_count() - 返回桶的最大數(shù)量
bucket_size() - 返回在特定的桶中的元素?cái)?shù)量
bucket(key) - 返回帶有特定鍵的桶
*哈希策略*
load_factor - 返回每個(gè)桶的平均元素?cái)?shù)量
max_load_factor - 管理每個(gè)桶的平均元素?cái)?shù)量的最大值
rehash - 為至少為指定數(shù)量的桶預(yù)留存儲(chǔ)空間。這會(huì)重新生成哈希表。
參考資料:
1.cpp primer 5th