來看一道題:請統計陣列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標記的範圍內所有元...