stl之關聯容器學習筆記2

2021-05-23 05:32:18 字數 2521 閱讀 7558

set型別容器

set容器只是單純的鍵的集合,其中的鍵必須唯一,且不能修改(const)。

舉個例子:

某軟體提供黑名單功能,其黑名單就可用set容器配置。在做某項操作前,先檢查黑名單。

2、set中,value_type不是pair型別,而是與key_type相同的型別。

因為只是單純的鍵集合,沒有關聯的值。

新增元素操作

1、s.insert(v):在s中新增值為v的元素。返回乙個pair型別,其組成包括乙個指向新新增元素的迭代器,和乙個是否成功新增元素的bool值。

2、s.insert(iter1,iter2):在s中新增iter1和iter2所組成的範圍內的元素。如範圍內存在重複的元素,則只新增一次。返回void。

獲取元素操作

1、s.find(v):在s中搜尋值為v的元素。如搜尋到,則返回指向被搜尋元素的迭代器。否則,返回指向超出容器末端的下一位置的迭代器。

2、s.count(v):統計s中搜尋值為v的元素的個數。返回值為為元素的個數。對於set來說,返回值只有可能是0或1。

multimap和multiset

map和set中,乙個鍵只能對應乙個值(鍵唯一)。而在multimap和multiset中,允許乙個鍵出現多次,也就形成了一鍵對應多值的結構。

例如,在**號碼本應用中,乙個人(鍵)可能有多個**號碼(值)。

multimap和multiset使用之前必須包含標頭檔案:

#include

#include

multimap和multiset所支援的操作,於map和set操作相同。只有乙個例外:multimap不支援下標操作,這也是合理的,因為某個鍵可能對應多個值。

新增與刪除元素

可直接呼叫insert和erase操作,基於一鍵對多值的結構,會有一些變化,考慮下面的例子:

multimapsi_mmap;

si_mmap.insert(make_pair(string("haha"),1));

si_mmap.insert(make_pair(string("haha"),2));

由於鍵不要求唯一,則每次呼叫insert總會新增乙個元素。以上的例子,對於haha鍵來說,有兩個值,1和2。

對應的,引數為乙個鍵的刪除操作,會刪除擁有該鍵的所有元素,考慮以下的例子:

multimap::size_type cnt;

cnt=si_mmap.erase("haha");

這將返回被刪除元素的個數。在本例中,cnt的值為2。

當然也會有引數為乙個或一對迭代器的版本,對於這個版本,只刪除被指向的元素(或範圍內的元素)。

查詢元素

map和set中的元素是順序儲存的,而multimap和multiset也一樣。因此,如果在容器中某個鍵對應多個值,則這些值是相鄰著存放的。這也就意味著,在用迭代器遍歷容器時,會依次返回特定鍵關聯的所有元素。

在map和set中查詢乙個元素很容易,要麼在,要麼不在。而在multimap和multiset中,就比較複雜,因為一鍵可能對應多值。

為了解決這一問題。有三種可行的方案。

1、使用find和count。考慮以下的例子:

string search_item("haha");

typedef multimap::size_type sz_type;

sz_type num=si_mmap.count(search_item);//獲取容器中,鍵為search_item的元素的個數

multimap::iterator iter=si_mmap.find(search_item);//獲取指向第乙個鍵為search_item的元素的迭代器

for(sz_type cnt=0;cnt!=num;++cnt,++iter)

cout 2、使用lower_bound和upper_bound函式

這是兩個關聯容器的操作

lower_bound引數為乙個鍵,返回乙個迭代器,指向鍵不小於k的第乙個元素。

upper_bound引數為乙個鍵,返回乙個迭代器,指向鍵大於k的第乙個元素。

如使用同乙個鍵呼叫以上兩個函式,則返回了乙個迭代器範圍,這個範圍恰好就是指定的鍵對應的所有值的範圍。

我們用這兩個函式重寫上面的例子:

typedef multimap::iterator mm_iter;

//以下兩個操作獲取迭代器對

mm_iter beg=si_mmap.lower_bound(search_item);

mm_iter end=si_mmap.upper_bound(search_item);

while(beg!=end)

cout 3、使用equal_range函式

這個函式使用乙個鍵作為引數,返回乙個pair型別,由lower_bound和upper_bound的返回值組成。

由以上的定義,我們可以寫出更簡潔的**,重寫以上的例子:

pairpos=si_mmap.equal_range(search_item);

while(pos.first!=pos.second)

cout

stl之關聯容器學習筆記1

概述 stl定義了另一種容器,名曰關聯容器,關聯容器和順序容器的本質區別在於 關聯容器通過鍵key來儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。關聯容器的大部分行為與順序容器相同,但其獨特之處在於支援鍵的使用。stl提供了兩個基本的關聯容器 1 map 容器中以鍵值的形式來...

STL學習筆記 關聯容器

stl中常用的關聯容器有四種 set map mutimap multiset。這四種容器中的元素都是按照鍵有序排列的,因此關聯容器的鍵值必須是可比較的。如果鍵值是基本型別可以直接使用,如果鍵值是自定義型別,需要定義帶有比較謂詞的建構函式map中儲存著一系列的鍵值對兒,每個鍵對應乙個值,鍵類似有索引...

STL之關聯容器

1.set單重集合 不允許key重複 set作為乙個容器,也是用來儲存同一資料型別的資料型別,並且能從乙個資料集合中取出資料 c stl中標準關聯容器set,multiset,map,multimap內部採用的就是一種非常高效的平衡檢索二叉樹 紅黑樹 include using namespace ...