基礎語法之五 multimap和multiset

2021-08-26 09:43:03 字數 1696 閱讀 8486

1、multimap和multiset 認知和使用

之前只是在c++ primer裡面看過關聯容器,可能因為沒有實際用過,只是看看,所以導致用的時候並不熟悉;

在這之前,map和set的特性應該要了解,map是關聯陣列,也就是由鍵值對組成的,而set只是關鍵字的集合,但是兩者都只允許關鍵字是唯一的,也就是對於乙個給定的關鍵字,它只能允許乙個元素的關鍵字等於它;

但是,容器multimap和multiset並沒有這個限制,它們都允許多個元素具有相同的關鍵字。

如何訪問multimap呢,也就是如何查詢元素呢?

這個時候需要先了解multimap的函式:

find(k) 返回第乙個關鍵字為k的迭代器

count(k) 返回關鍵字等於k的個數

lower_bound(k) 返回第乙個關鍵字不小於k的元素

upper_bound(k) 返回第乙個關鍵字大於k的元素

equal_bound(k) 上面返回的是迭代器,但是這裡返回的迭代器pair,表示關鍵字等於k的元素的範圍,若k不存在,pair的兩個成員均等於end()

注意:多個相同的關鍵字儲存在容器中時,則會相鄰儲存;

根據以上的函式,可以使用三種方法進行查詢元素

1.1第一種方法:find + count

multimap

<

string

, int

> maps;

string

word

("word"

);//

注意是第乙個出現的

auto

itr = maps.find(word);

auto

cnt = maps.count(word);

//迴圈便利

while

(cnt)

1.2 第二種方法:lower_bound + upper_bound

multimap

<

string

, int

> maps;

string

word

("word"

);//

其實就是乙個區間,因為儲存位置連續

for(

auto

beg = maps.lower_bound(word), end = maps.upper_bound(word); beg != end; ++beg)

1.3 第三種方法:equal_range

multimap

<

string

, int

> maps;

string

word

("word"

);//

和上面不一樣,直接返回乙個區間

for(

auto

pos = maps.equal_range(word); pos.first != maps.end(); ++pos.first)

對了還有unordered,這是沒有進行排序的,同樣的這些無序容器同樣有重複關鍵字的版本-unordered_multimap,unordered_multiset,這些是用雜湊函式實現,沒有unordered的則是用紅黑樹實現的。

STL之map和multimap總結

map c 預設建構函式 建立乙個空map multimap map c op 建立乙個空map multimap,並以op原則作為排序準則 map c c2 複製建構函式 建立乙個新的map multimap 作為c2的副本 所有元素都被複製 map c c2 複製建構函式 建立乙個新的map 作...

Scala基礎語法五

1.柯里化 柯里化 currying 指的是將原來接受兩個引數的函式變成新的接受乙個引數的函式的過程,新的函式返回乙個以原有第二個引數為引數的函式 示例 定義乙個方法 def add x int,y int x y呼叫這個方法應該是add 1,2 現在將這個方法變形 def add x int y ...

SQL基礎語法(五)

sql insert into 語句 insert into 語句 insert into 語句用於向 中插入新的行。語法 insert into 表名稱 values 值1,值2,我們也可以指定所要插入資料的列 insert into table name 列1,列2,values 值1,值2,插...