關聯容器支援高效的關鍵字查詢和訪問,兩個主要的關聯容器是set和map。map中的元素是一些鍵值對(key-value),關鍵字起著索引的作用,值則表示與索引相關聯的資料,set中的元素只包含乙個關鍵字。set支援高效的關鍵字查詢操作,底層應該是用的雜湊表來實現的。
c++標準庫提供了8個關聯容器,這8個容器的不同體現在三個維度上:
set或者map
有序或者無序—有無unordered字首
允許或禁止重複關鍵字—有無multi字首
使用map:
//統計每個單詞在輸入中出現的次數
map word_count; //新建map
string word;
while(cin>>word)
++word_count[word]; //將該單詞所對應的次數加1
for(const
auto &w:word_count)
cout
<" occurs "
<1)?" times":" time")《需要注意,對於map的下標操作如果使用word_count[word],在未找到word關鍵字的時候會新增乙個關鍵字為word的元素,對其值進行初始化。如果使用word_count.at(word),在未找到word關鍵字的時候會丟擲乙個out_of_range異常。
使用set:
//統計輸入中每個單詞出現的次數
map word_count;
set exclude=;
string word;
while(cin>>word)
if(exclude.find(word)==exclude.end()) //當在set中未find時,返回尾迭代器
++word_count[word];
pair類定義在標頭檔案utility中,乙個pair儲存兩個資料成員。類似於容器,pair是乙個用來生成特定型別的模板。當建立乙個pair的時候,我們必須提供兩個型別名。
pair word_count; //儲存string和size_t
與其他的標準庫型別不同,pair的資料成員是public的,兩個成員分別命名為first和second,map中儲存的元素就是pair型別的。
關聯容器還定義了其他的型別,這些型別表示容器關鍵字和值的型別:
set
::value_type v1; //string
set::key_type v2; //string
map::value_type v3; //pair
map::key_type v4; //string
map
當解引用乙個關聯容器的迭代器時,會得到乙個型別為容器的value_type的值的引用。對map而言,value_type是乙個pair型別,其first成員儲存const的關鍵字,second成員儲存值:
//獲得指向word_count中乙個元素的迭代器
auto map_it=word_count.begin();
//*map_it是指向乙個pair物件的引用
cout
cout
<<" "
map_it->first="new key"; //錯誤,關鍵字是const的
++map_it->second; //值的元素是可以改變的
乙個set中的關鍵字也是const的。可以用乙個set來讀取元素的值,但是不能修改:
set
iset=;
set::iterator set_it=iset.begin();
if(set_it!=iset.end())
C 中的關聯容器
1.關聯容器型別 有序容器使用比較函式來比較關鍵字,從而將元素按順序儲存。預設情況下,比較操作是採用關鍵字型別的 運算子。無序容器使用關鍵字型別的 運算子和乙個hash型別的物件來組織元素。1 按關鍵字有序儲存 map關聯陣列 儲存關鍵字 值對 set關鍵字即值,即只儲存關鍵字的容器 multima...
C C 中STL的容器
一 六種序列容器 1 vector 向量 類似乙個陣列。區別在於 動態儲存 記憶體耗用更大,因為stl內部實現時,首先分配乙個非常大的記憶體空間預備進行儲存,即capacituy 函式返回的大小,當超過此分配的空間時再整體重新放分配一塊記憶體儲存,這給人以vector可以不指定vector即乙個連續...
C C 中的順序容器
乙個容器就是一些特定型別物件的集合。順序容器提供了控制元素儲存和訪問順序的能力。順序容器型別 選取順序容器的一些準則 與內建陣列相比,array是一種更安全,更容易使用的陣列型別,現代c 程式應該使用標準庫容器,而不是更原始的資料結構比如內建陣列 除非有很好的理由選擇其他容器,否則使用vector ...