map與multimap區別,find具體使用
一. Map與 Multimap 特點
Map 和 Multimap 將(key/value) 一組當做元素,它們可以根據 key 的排序準則自動將元素排序。
Multimap允許重複元素,map不允許重複。
型別定義:
- typedef std::map<std::string, float, std::greater<string> > StringFloatMap;
- ...
- StringFloatMap coll;
注意,兩個>之間需加上一個空格,因為>>會被編譯器視為移位操作符。
Map 和 multimap 通常以平衡二叉樹
通常,不能直接改變key 的值,value 的值是可以直接修改的,因此可以想像元素的實質型別是 pair<constkey, T>。
二. 搜尋函式
- //返回鍵值等於 key 的元素個數
- m.count(key)
- //返回鍵值等於 key 的第一個元素,找不到就返回 end()
- m.find(key)
- //返回 鍵值 >= key 的第一個元素位置
- m.lower_bound(key)
- //返回 鍵值 >= key 的第一個元素位置
-
m.upper_bound(key)
- //返回 鍵值 == key 的元素區間
- m.equal_range(key)
注意:
所有的搜尋函式,引數是key,而不是value。這樣你就不能以 find() 搜尋擁有某特定 value 的元素。
三. 插入和刪除函式
- //插入
- c.insert(elem)
- c.insert(pos,elem)
- c.insert(beg,end)
- //刪除
- c.erase(elem)
- c.erase(pos)
- c.erase(beg,end)
注意:
刪除元素時,會使 pos 無效,如下
- //使迭代器失效,注意!!!!
- typedef std::map<std::string,float> StringFloatMap;
- StringFloatMap coll;
- StringFloatMap::iterator pos;
- ...
- for (pos = coll.begin(); pos != coll.end(); ++pos)
- {
- if (pos->second == value) {
- coll. erase (pos); // 出錯 !!!
- }
- }
- //正確處理迭代器所指元素的方法
- typedef std::map<std::string,float> StringFloatMap;
- StringFloatMap coll;
- StringFloatMap::iterator pos, tmp_pos;
- ...
- //remove all elements having a certain value
- for (pos = c.begin(); pos != c.end(); )
- {
- if (pos->second == value) {
- c.erase(pos++); // Make clear!!
- }
- else {
- ++pos;
- }
- }
四. 將 map 視為關聯陣列
m[key],這裡下標是元素key,索引可以是任意型別,而非侷限為整型。
注意:
- coll["otto"] = 7.7;
不小心會引起誤操作,如:
- std::cout << coll ["ottto"]; // otto拼寫錯了
五. 將 value 值傳入 map
1. 運用 value_type,value_type 是容器本身提供的型別定義。
- std::map<std::string,float> coll;
- ...
- coll.insert(std::map<std::string, float>::value_type("otto", 22.3));
注,系統中 value_type 的定義如下:
typedef pair<const Key, T> value_type;
2. 運用 pair< >
- std::map<std::string, float> coll;
- ...
- //隱式轉換為const:
- coll.insert(std::pair<std::string, float>("otto",22.3));
- //顯示轉換:
- coll.insert(std::pair<<strong>const</strong> std::string, float>("otto",22.3));
- std::map<std::string,float> coll;
- ...
- coll.insert(std::make_pair("otto",22.3));
注:以上三種方法,在實際開發中可以試著用,因為有些編譯器並不能很好的支援其中方法,比如 VC6.0 就不能很好的使用 make_pair(),不過改用value_type是可以的。
相關推薦
map與multimap區別,find具體使用
一. Map與 Multimap 特點 Map 和 Multimap 將(key/value) 一組當做元素,它們可以根據 key 的排序準則自動將元素排序。 Multimap允許重複元素,map不允許重複。 型別定義: typedef std::map&
spark中map與mapPartitions區別
part print map spark 偽代碼 一個 數據 最終 partition 在spark中,map與mapPartitions兩個函數都是比較常用,這裏使用代碼來解釋一下兩者區別 import org.apache.spark.{SparkConf, Spar
Android 版本控制工具SVN與GIT 區別, Git使用詳情
為什麼要用版本控制工具? 多人協作開發 方便程式碼統一管理 常用的版本控制工具有哪些? CVS, SVN, GIT GIT 和 SVN 的區別 Git 是目前世界上最先進的分散式版本控制系統 SVN 是集中式的管理工具 1.版本庫是集中放在中央伺服器的,而幹活的時
map與apply區別
1. 使用map方法 Python程式碼 import multiprocessing import time&nb
kotlin學習:val與var區別,by lazy與lateinit區別
Kotlin中var和val的區別 Kotlin中有兩個關鍵字定義變數,這兩個關鍵字外形看著差別很小就只差了一個字母,但實際差別很大的。 var是一個可變【變數】,這是一個可以通過重新分配來更改為
Java中&與&&的區別,|與||的區別
這個是轉載別人的 個人感覺不錯, 在java中,很多人都不知道&與&&,|與||的區別。 &,&&:(與,短路與):一樣的地方就是二者執行最後的結果是一樣的,但是執行的過程有區別, 對於&:無論&左邊是
__weak與__block區別,深層理解兩者區別
準備工作 首先我定義了一個類 MyObject 繼承 NSObject,並添加了一個屬性 text,重寫了description方法,返回 text 的值。這個主要是因為編譯器本身對 NSString 是有優化的,建立的 string 物件有可能是靜態儲存區永不
python深拷貝與淺拷貝,is與==的區別,copy()與deepcopy()
1.is與==的區別 is是比較兩個引用是否指向了同一個物件 ==是比較兩個物件值是否相等 2.深拷貝與淺拷貝 淺拷貝:對物件的頂層拷貝,可以理解為增加了一個引用,沒有拷貝內容,即沒有新生成拷貝的記憶體空間,兩個指的是同一塊 深拷貝:對一個物件所有層次
字串處理中sizeof與strlen區別,以及末尾的\0
char *ch = "wonima aisaoziaaa"; int n = sizeof(ch); // 指標長度,對於64平臺來說,值為8 int nn = sizeof(*ch); // 一個字元的長度,值為1 int nnn = strlen(ch); //
MPEG-4與H264區別,編碼及應用
MPEG4於1998年11月公佈,原預計1999 年1月投入使用的國際標準MPEG4不僅是針對一定位元率下的視訊、音訊編碼,更加註重多媒體系統的互動性和靈活性。MPEG專家組的專家們正在為MPEG-4的制定努力工作。MPEG-4標準主要應用於視像電話(V
memcpy與strcpy區別,memcmp與strcmp的區別
memcpy c和c++使用的記憶體拷貝函式,memcpy函式的功能是從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中。 中文名 記憶體拷貝函式 外
ibatis $與#的區別,及排序問題
在sql配置中#{}#,與${}$ 在ibatis中使用這兩種方式進行引數引用,區別為,符號#可以進行與編譯,進行型別匹配,而$不進行資料型別匹配 例:select * from table where name = #name#,其中如果name為varchar型別,#n
GBDT與xgb區別,以及梯度下降法和牛頓法的數學推導
2019年01月05日 15:48:32 IT界的小小小學生 閱讀數:31 標籤: xgb gbdt 梯度下降法 牛頓法 xgboost原理 更多 個人分類: data mining 深度學習
C++STL容器----map與multimap容器
一、定義 Map是STL [1] 的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道 《百度百科》 簡單來說,對於
交換機與路由器區別,二、三層交換機工作原理
最近上班就是開會、寫文件,閒的時候也不想幹什麼事,真心沒學什麼技術上的東西,這樣真的不行啊!先發篇之前學的東西激勵下自己! 內容為網上找的多篇文章融合並總結而來,圖有一些是自己畫的,也算是原創了吧。 交換機與路由器區別,工作流程 核心層與核心交換機: 在網路行業中核心交
Aspectj中call與execution區別,織入程式碼位置不同
call 呼叫通知的環境是方法呼叫位置;而execution是方法執行位置,也就是方法簽名處。 具體結合一個示例可以更簡單跟容易理解: 1、pointcut配置: pointcut callPointCut():execution(public
fastjson中Map與JSONObject互換,List與JOSNArray互換的實現
在開發過程中經常用到Map,與List轉換成json返回前臺的情況,找了一些實現方法,在此記錄,方便以後查詢。 1、//將map轉換成jsonObject JSONObject itemJSONObj = JSONObject.parseObject(JSON.t
字元與位元組區別,編碼格式的字元長度
(一)“位元組”的定義 位元組(Byte)是一種計量單位,表示資料量多少,它是計算機資訊科技用於計量儲存容量的一種計量單位。 (二)“字元”的定義 字元是指計算機中使用的文字和符號,比如1、
spark RDD 的map與flatmap區別說明
HDFS到HDFS過程看看map 和flatmap的位置Flatmap 和map 的定義 map()是將函式用於RDD中的每個元素,將返回值構成新的RDD。flatmap()是將函式應用於RDD中的每個元素,將返回的迭代器的所有內容構成新的RDD例子:val rdd = sc
fastjson Map與JSONObject互換,List與JOSNArray互換的實現
目錄 1、使用場景 由於在於前端頁面引數交換的時候可能傳遞多行記錄值或者物件Array,在Java後端接收後需要處理相關資料,此時需要針對傳入的資料進行轉為的JSON物件或者JSONArray物件。於是有了使用阿里巴巴之中的相關JSON包 fastjs