1. 程式人生 > >map與multimap區別,find具體使用

map與multimap區別,find具體使用

一. Map與 Multimap 特點

Map 和 Multimap 將(key/value) 一組當做元素,它們可以根據 key 的排序準則自動將元素排序。


Multimap允許重複元素,map不允許重複

型別定義:

  1. typedef std::map<std::string, float, std::greater<string> > StringFloatMap;  
  2.    ...  
  3. StringFloatMap coll;  

注意,兩個>之間需加上一個空格,因為>>會被編譯器視為移位操作符。

Map 和 multimap 通常以平衡二叉樹

來實現,map 和 multimap 擁有 set 和 multiset 所有能為和所有操作函式。

通常,不能直接改變key 的值,value 的值是可以直接修改的,因此可以想像元素的實質型別是 pair<constkey, T>。

二. 搜尋函式

  1. //返回鍵值等於 key 的元素個數
  2. m.count(key)  
  3. //返回鍵值等於 key 的第一個元素,找不到就返回 end()
  4. m.find(key)  
  5. //返回 鍵值 >= key 的第一個元素位置
  6. m.lower_bound(key)  
  7. //返回 鍵值 >= key 的第一個元素位置
  8. m.upper_bound(key)  
  9. //返回 鍵值 == key 的元素區間
  10. m.equal_range(key)  

注意:

所有的搜尋函式,引數是key,而不是value。這樣你就不能以 find() 搜尋擁有某特定 value 的元素。

三. 插入和刪除函式

  1. //插入
  2. c.insert(elem)   
  3. c.insert(pos,elem)  
  4. c.insert(beg,end)  
  5. //刪除
  6. c.erase(elem)  
  7. c.erase(pos)  
  8. c.erase(beg,end)  
操作和 set 一樣,不同的是引數是value,而不是key。這裡要區別於上面搜尋函式的引數。

注意:

刪除元素時,會使 pos 無效,如下

  1. //使迭代器失效,注意!!!!
  2. typedef std::map<std::string,float> StringFloatMap;  
  3. StringFloatMap coll;  
  4. StringFloatMap::iterator pos;  
  5. ...  
  6. for (pos = coll.begin(); pos != coll.end(); ++pos)   
  7. {  
  8.    if (pos->second == value) {  
  9.             coll. erase (pos);    // 出錯 !!!
  10.    }  
  11. }  
  12. //正確處理迭代器所指元素的方法
  13. typedef std::map<std::string,float> StringFloatMap;  
  14. StringFloatMap coll;  
  15. StringFloatMap::iterator pos, tmp_pos;  
  16. ...  
  17. //remove all elements having a certain value
  18. for (pos = c.begin(); pos != c.end(); )   
  19. {  
  20.        if (pos->second == value) {  
  21.            c.erase(pos++);        // Make clear!!
  22.        }  
  23.        else {  
  24.            ++pos;  
  25.        }  
  26. }  
pos++,是這樣執行的,首先pos會移向下一個元素,但pos++返回的還是原來的pos的位置

四. 將 map 視為關聯陣列

m[key],這裡下標是元素key,索引可以是任意型別,而非侷限為整型。

注意:

  1. coll["otto"] = 7.7;  
處理 coll["otto"] 時,如果存在鍵值 "otto",則返回元素的引用,如果不存在鍵值 "otto",則會自動安插一個新元素,鍵值為 "otto",value以default實現。

不小心會引起誤操作,如:

  1. std::cout << coll ["ottto"];  // otto拼寫錯了
不會有錯誤提示,反而會插入一個新的元素。

五. 將 value 值傳入 map

1. 運用 value_type,value_type 是容器本身提供的型別定義。

  1. std::map<std::string,float> coll;  
  2. ...  
  3. coll.insert(std::map<std::string, float>::value_type("otto", 22.3));  

注,系統中 value_type 的定義如下:

typedef pair<const Key, T> value_type;

2. 運用 pair< >

  1. std::map<std::string, float> coll;  
  2. ...  
  3. //隱式轉換為const:
  4. coll.insert(std::pair<std::string, float>("otto",22.3));  
  5. //顯示轉換:
  6. coll.insert(std::pair<<strong>const</strong> std::string, float>("otto",22.3));  
3. make_pair( )
  1. std::map<std::string,float> coll;  
  2.    ...  
  3. coll.insert(std::make_pair("otto",22.3));  

注:以上三種方法,在實際開發中可以試著用,因為有些編譯器並不能很好的支援其中方法,比如 VC6.0 就不能很好的使用 make_pair(),不過改用value_type是可以的。

相關推薦

mapmultimap區別find具體使用

一. Map與 Multimap 特點 Map 和 Multimap 將(key/value) 一組當做元素,它們可以根據 key 的排序準則自動將元素排序。 Multimap允許重複元素,map不允許重複。 型別定義: typedef std::map&

spark中mapmapPartitions區別

part print map spark 偽代碼 一個 數據 最終 partition 在spark中,map與mapPartitions兩個函數都是比較常用,這裏使用代碼來解釋一下兩者區別 import org.apache.spark.{SparkConf, Spar

Android 版本控制工具SVNGIT 區別 Git使用詳情

為什麼要用版本控制工具? 多人協作開發 方便程式碼統一管理 常用的版本控制工具有哪些? CVS, SVN, GIT GIT 和 SVN 的區別 Git 是目前世界上最先進的分散式版本控制系統 SVN 是集中式的管理工具 1.版本庫是集中放在中央伺服器的,而幹活的時

mapapply區別

1. 使用map方法   Python程式碼   import multiprocessing   import time&nb

kotlin學習:valvar區別by lazylateinit區別

Kotlin中var和val的區別 Kotlin中有兩個關鍵字定義變數,這兩個關鍵字外形看著差別很小就只差了一個字母,但實際差別很大的。 var是一個可變【變數】,這是一個可以通過重新分配來更改為

Java中&&&的區別|||的區別

這個是轉載別人的 個人感覺不錯, 在java中,很多人都不知道&與&&,|與||的區別。 &,&&:(與,短路與):一樣的地方就是二者執行最後的結果是一樣的,但是執行的過程有區別, 對於&:無論&左邊是

__weak__block區別深層理解兩者區別

準備工作 首先我定義了一個類 MyObject 繼承 NSObject,並添加了一個屬性 text,重寫了description方法,返回 text 的值。這個主要是因為編譯器本身對 NSString 是有優化的,建立的 string 物件有可能是靜態儲存區永不

python深拷貝淺拷貝is==的區別copy()deepcopy()

1.is與==的區別 is是比較兩個引用是否指向了同一個物件 ==是比較兩個物件值是否相等 2.深拷貝與淺拷貝 淺拷貝:對物件的頂層拷貝,可以理解為增加了一個引用,沒有拷貝內容,即沒有新生成拷貝的記憶體空間,兩個指的是同一塊  深拷貝:對一個物件所有層次

字串處理中sizeofstrlen區別以及末尾的\0

char *ch = "wonima aisaoziaaa"; int n = sizeof(ch); // 指標長度,對於64平臺來說,值為8 int nn = sizeof(*ch); // 一個字元的長度,值為1 int nnn = strlen(ch); //

MPEG-4H264區別編碼及應用

  MPEG4於1998年11月公佈,原預計1999 年1月投入使用的國際標準MPEG4不僅是針對一定位元率下的視訊、音訊編碼,更加註重多媒體系統的互動性和靈活性。MPEG專家組的專家們正在為MPEG-4的制定努力工作。MPEG-4標準主要應用於視像電話(V

memcpystrcpy區別memcmpstrcmp的區別

memcpy  c和c++使用的記憶體拷貝函式,memcpy函式的功能是從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中。 中文名 記憶體拷貝函式  外

ibatis $#的區別及排序問題

在sql配置中#{}#,與${}$ 在ibatis中使用這兩種方式進行引數引用,區別為,符號#可以進行與編譯,進行型別匹配,而$不進行資料型別匹配 例:select * from table where name = #name#,其中如果name為varchar型別,#n

GBDTxgb區別以及梯度下降法和牛頓法的數學推導

  2019年01月05日 15:48:32 IT界的小小小學生 閱讀數:31 標籤: xgb gbdt 梯度下降法 牛頓法 xgboost原理 更多 個人分類: data mining 深度學習

C++STL容器----mapmultimap容器

一、定義 Map是STL [1]  的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道 《百度百科》 簡單來說,對於

交換機路由器區別二、三層交換機工作原理

最近上班就是開會、寫文件,閒的時候也不想幹什麼事,真心沒學什麼技術上的東西,這樣真的不行啊!先發篇之前學的東西激勵下自己! 內容為網上找的多篇文章融合並總結而來,圖有一些是自己畫的,也算是原創了吧。 交換機與路由器區別,工作流程 核心層與核心交換機: 在網路行業中核心交

Aspectj中callexecution區別織入程式碼位置不同

call 呼叫通知的環境是方法呼叫位置;而execution是方法執行位置,也就是方法簽名處。 具體結合一個示例可以更簡單跟容易理解: 1、pointcut配置: pointcut callPointCut():execution(public

fastjson中MapJSONObject互換ListJOSNArray互換的實現

在開發過程中經常用到Map,與List轉換成json返回前臺的情況,找了一些實現方法,在此記錄,方便以後查詢。 1、//將map轉換成jsonObject  JSONObject itemJSONObj = JSONObject.parseObject(JSON.t

字元位元組區別編碼格式的字元長度

(一)“位元組”的定義 位元組(Byte)是一種計量單位,表示資料量多少,它是計算機資訊科技用於計量儲存容量的一種計量單位。 (二)“字元”的定義 字元是指計算機中使用的文字和符號,比如1、

spark RDD 的mapflatmap區別說明

HDFS到HDFS過程看看map 和flatmap的位置Flatmap 和map 的定義 map()是將函式用於RDD中的每個元素,將返回值構成新的RDD。flatmap()是將函式應用於RDD中的每個元素,將返回的迭代器的所有內容構成新的RDD例子:val rdd = sc

fastjson MapJSONObject互換ListJOSNArray互換的實現

目錄 1、使用場景       由於在於前端頁面引數交換的時候可能傳遞多行記錄值或者物件Array,在Java後端接收後需要處理相關資料,此時需要針對傳入的資料進行轉為的JSON物件或者JSONArray物件。於是有了使用阿里巴巴之中的相關JSON包 fastjs