小結(jié)
關(guān)聯(lián)容器通過關(guān)鍵字查找和提取元素。對關(guān)鍵字的使用將關(guān)聯(lián)容器與順序容器區(qū)分開來,順序容器中是通過位置訪問元素的。
標(biāo)準(zhǔn)庫定義了8個關(guān)聯(lián)容器,每個容器:
- 是一個
map或者是一個set。map保存關(guān)鍵字-值對;set只保存關(guān)鍵字。 - 要求關(guān)鍵字唯一或不要求。
- 保持關(guān)鍵字有序或不保證有序。
- 允許重復(fù)關(guān)鍵字的容器的名字都包含有
multi,而使用哈希技術(shù)的容器的名字都以unordered開頭。set是一個有序集合,其中每個關(guān)鍵字只可以出現(xiàn)一次;而unordered_multiset則是一個無序的關(guān)鍵字集合,其中關(guān)鍵字可以出現(xiàn)多次。
使用關(guān)聯(lián)容器
- 使用
map:
定義一個map需要指定關(guān)鍵字和值的類型;
map中提取的pair是一個模板類型,保存兩個名為first和second的成員。
int main() {
map<string,size_t> word_count;
string word;
while(cin>>word && word!="stop")
++word_count[word];
for(const auto &w: word_count)
cout << w.first << " occurs " << w.second
<< ((w.second > 1) ? " times" : "time") << endl;
}
- 使用
set:
find調(diào)用返回一個迭代器,如果為找到,find返回尾后迭代器。
map<string,size_t> word_count;
//給定類型;列表初始化關(guān)聯(lián)容器
set<string> exclude={"The", "but","And"};
string word;
while(cin>>word && word!="stop")
if(exclude.find(word)==exclude.end())
++word_count[word];