STL map的operator 到底是怎麼回事

2021-08-19 07:12:58 字數 1946 閱讀 7994

來看一道題:請統計陣列strs裡各個字元出現的次數。(使用map)

string strs = ;

那麼最直觀,最容易想到的方法,就是用first來存字元,second來存次數。

map

countmap;//first為string型別存字元,second為size_t型別存次數

for (size_t i = 0; i < sizeof(strs) / sizeof(strs[0]); i++)

else

//之前沒有,則插入

}

這樣簡單易懂的方法,不需多說,那麼接下來,看一下map的insert到底是怎麼實現的呢?

pairbool> insert (const value_type& val);
可以看到,返回值為pair,first是迭代器,second為bool值。

閱讀文件,可知:

如果插入之前沒有的值,那麼iterator指向插入之後的該節點,true

如果插入之前已經有的值,那麼iterator指向本來存在的該節點,false

例如:

map

countmap;

pair

::iterator, bool> ret = countmap.insert(make_pair("sort", 1))

因為countmap裡之前沒有」sort」,所以順利插入,ret的first指向該節點,second為true。

繼續插入:

pair

::iterator, bool> ret2 = countmap.insert(make_pair("sort", 2));

此時」sort」已經存在,所以ret的first指向之前的節點,second為false。

現在已經了解了insert的用法,那麼剛才的第一中方法就有一些不好,因為insert一定是查詢了,find也是查詢了,所以效率不夠高。

基於對insert的理解,我得出了第二種方法:

for (size_t i = 0; i < sizeof(strs) / sizeof(strs[0]); i++)

}

ret是pair型別,插入之後:first為指向strs[i]的迭代器,second為是否成功

如果str[i]不存在,iterator指向插入之後的節點,bool為true,iterator指向的second為1

如果str[i]存在,iterator指向本來存在的節點,但是本來存在的second並沒有++,所以需要手動++

這個方法確實不錯,接下來介紹重頭戲,operator

dict["sort"] = "排序"
insert的返回值裡first指向構造的節點,該節點的first為」sort」,second為string預設值,然後將second賦值為」排序」。

那麼這道題就有了第三種解法:

for (size_t i = 0; i

< sizeof(strs) / sizeof(strs[0]); i++)

首先這是正確的:

首先operator,插入了strs[i],成功或者失敗,然後得到了該節點的second,出現一次就++一次,那麼就可以統計出來次數。

這就是map的operator的用法。

STL map的簡單使用

c stl map map是關聯對映,它的內部採用紅黑樹演算法。預設對插入按key公升序排列。typedef map tstring,int iterator mapi typedef map iterator umapi brief 試驗性 入口 void miscmain map自動按照key公...

STL map的常用指令

在acm中常用的指令。map是stl內的乙個關聯容器,提供一對一的對映,每個關鍵字 key 在容器中只出現一次,然後提供乙個對應的值 value 1.初始化 mapm 2.插入元素 m 1 what m 2 the map中最常用的插入新增 使用pair插入 employees.insert std...

STL map的用法介紹!

使用前新增map標頭檔案,必須分別指明鍵和值的型別 mapword count map的建構函式 mapm 建立乙個名為m的空map物件,其鍵值型別分別為k和v mapm m2 建立m2的副本m,m與m2必須有相同的鍵值型別 mapm b,e 建立map型別的物件,儲存迭代器b和e標記的範圍內所有元...