C C 中的關聯容器

2021-08-20 10:15:17 字數 1861 閱讀 6568

關聯容器支援高效的關鍵字查詢和訪問,兩個主要的關聯容器是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 ...