C 中的關聯容器

2021-08-14 21:09:13 字數 3695 閱讀 4313

1.關聯容器型別

有序容器使用比較函式來比較關鍵字,從而將元素按順序儲存。預設情況下,比較操作是採用關鍵字型別的《運算子。無序容器使用關鍵字型別的==運算子和乙個hash型別的物件來組織元素。

<1>按關鍵字有序儲存

map關聯陣列;儲存關鍵字-值對

set關鍵字即值,即只儲存關鍵字的容器

multimap

關鍵字可重複出現的map

multiset

關鍵字可重複出現的set

<2>無序集合

unordered_map 

用雜湊函式組織的map

unordered_set 

用雜湊函式組織的set

unordered_multimp 

雜湊組織的map;關鍵字可以重複出現

unordered_multiset       

雜湊組織的set;關鍵字可以重複出現

<3>map和set混用例項

int main()

; string word;

while (cin >> word)

if (exclude.find(word) == exclude.end())//只統計不在exclude中的單詞

++word_count[word];//如果word還未在map中,下標運算子會建立乙個新元素

for (auto w : word_count)

cout << w.first << " occurs " << w.second <<((w.second>1)?" times ":" time ")<< endl;

system("pause");

return 0;

}

2.pair型別

<1>乙個pair儲存兩個資料成員。類似容器,pair是乙個用來生成特定型別的模板。定義在標頭檔案utility中。

pairp1;

pairp2;

3.關聯容器操作

<1>

key_type

容器型別的關鍵字型別

每個關鍵字關聯的型別;只適用於map

value_type

int main()

<2>關聯容器迭代器

當解引用乙個關聯容器迭代器時,我們會得到乙個型別為容器的value_type的值的引用。注意:不能改變關鍵字成員的值。

int main()

,, };

auto map_it = m.begin();

map_it->first = 5;//錯誤。「map_it」: 不能給常量賦值

map_it->second = "yan";//正確

system("pause");

return 0;

}

set的迭代器是const的,所以可以用乙個set迭代器來讀取元素的值,但不能修改。

int main()

; set::iterator set_it = s.begin();

*set_it = 6;//錯誤。「set_it」: 不能給常量賦值

system("pause");

return 0;

}

4.向關聯容器中新增元素

<1>要注意的是,map中元素的型別是pair。

int main()

); word_count.insert(pair("rong", 3));

system("pause");

return 0;

}

<2>insert返回的值依賴於容器型別和引數。對於不包含關鍵字的容器,新增單一元素的insert和emplace版本返回乙個pair。pair的first成員是乙個迭代器,指向具有給定關鍵字的元素;second成員是乙個bool值,指出元素是插入成功還是已經存在於容器中。如果關鍵字已經存在於容器中,則insert什麼事情也不做,返回值的bool部分為false。如果關鍵字不存在,元素被插入到容器中,且bool值為true。

理解下面**(c++ primerp385頁):

int main()

); if (!ret.second)

++ret.first->second;

} system("pause");

return 0;

}

<3>向multiset或multimap中新增元素時,insert總會插入乙個元素。此時,insert操作返回乙個指向新元素的迭代器,指向這個新插入的元素。

5.向關聯容器中刪除元素

c.erase(k)  

從c中刪除每個關鍵字為k的元素。返回乙個size_type值。指出刪除元素的數量。

c.erase(p)  

從c中刪除迭代器p指定的元素。p必須指向c中乙個真實元素,不能等於c.end()。返回乙個指向p之後元素的迭代器。若p指向c中的尾元素,則返回c.end()

c.erase(b,e)                                            

刪除迭代器對b和e所表示的範圍中的元素。返回e

6.map的下標操作

map和unordered_map容器提供了下標運算子和乙個對應的at函式。注意set型別不支援下標運算子,因為沒有於關鍵字相關聯的值。同時,也不能對乙個multimap或乙個unordered_multimap進行下標操作,因為這兩個容器可能有多個值與乙個關鍵字相對應。

map的下標運算與以前其它下標運算的不同之處是返回型別。一般來說,解引用乙個迭代器返回的型別與下標運算子返回的型別是一樣的。但在map中,當對map進行下標操作時,會得到乙個value_type物件(值),但當解引用乙個map迭代器時,會得到value_type物件(pair)。此外,若關鍵字還未在map中,下標運算子會新增乙個新元素。

7.訪問元素

<1>lower_bound或upper_bound不適用於無序容器。此外,下標和at操作只適應用於非const的map和unordered_map。

c.find(k)

返回乙個迭代器,指向第乙個關鍵字為k的元素,若k不在容器中,則返回尾後迭代器

c.count(k)

返回關鍵字等於k的元素的數量。對於不允許重複關鍵字的容器,返回值永遠是0或1

c.lower_bound(k)

返回乙個迭代器,指向第乙個關鍵字不小於k的元素

c.upper_bound(k)                                 

返回乙個迭代器,指向第乙個關鍵字大於k的元素

c.equal_range(k)                         

返回乙個迭代器pair,表示關鍵字等於k的元素的範圍。若k不存在,pair的兩個成員均等於c.end()

<2>對map使用find代替下標操作

下標操作的***是有時我們只想知道乙個元素是否在map中,但利用下標操作使得元素不存在時會自動新增。所以只檢視時可以借助上表中的方法。

<3>應用舉例

int main()

system("pause");

return 0;

}

int main()

c 關聯容器

1.map建構函式 mapm 普通初始化 mapm m2 複製初始化法 mapm b,e 另乙個map物件的迭代器初始化法 注意 1 鍵值型別必須定義 操作符號,資料訪問時需要呼叫。2 m aaa 下表訪問方式導致的結果是,若鍵對應的值不存在,則插入該鍵值對應的預設值。2.map插入操作 m.ins...

C 關聯容器

1.關聯容器是通過關鍵字來儲存和訪問資料的。關聯容器分為兩大類 map和set。其中,map是通過鍵值對來操作的,這裡的鍵就是關鍵字,值就是對應的資料。例如 mapm 定義了乙個空的map變數m,它的關鍵字型別是int,關鍵字對應的值的型別是int。可以將map理解成為函式,關鍵字是自變數,關鍵字對...

C 關聯容器

1 關聯容器定義 關聯容器和順序容器的本質差別在於 關聯容器通過鍵 key 儲存和讀取元素,而順序容器 則通過元素在容器中的位置順序儲存和訪問元素。關聯容器 associative containers 支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是 map set。map 的元素以鍵 ...