無序關(guān)聯(lián)容器【GeekBand】

本周老師講解了關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容