from:
一、關於map的介紹
map是stl的乙個容器,和set一樣,map也是一種關聯式容器。它提供一對一(其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,有助於我們處理一對一資料。這裡說下map內部資料的組織,map內部是自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對資料自動排序的功能,所以在map內部所有的資料都是有序的。學習map我們一定要理解什麼是
一對一的資料對映?比如:乙個班級中,每個學生的學號跟他的姓名就存在著一一對映的關係,這個模型用map可能輕易描述,很明顯學號用int 描述,姓名用字串描述採用的string,於是我們使用的map形式如下:mapstudent;
關於map和set底層實現以及效率問題,在另一篇《stl中set容器的一點總結》已經說了一些,map和set底層實現都是採用了平衡樹來實現的。這裡說一下map和set容器的區別。
對於map中的每個節點儲存的是一對資訊,包括乙個鍵和乙個值,各個節點之間的鍵值不能重複。
對於set中的每個節點儲存的是乙個資訊,只有乙個鍵,但是每個鍵值也是唯一的。set表示的是集合的概念。
對於map的學習,或者說是對stl中的容器的學習,要知道每種容器的實現原理,每種適合適合解決什麼問題的,才關鍵~~~~
二、map中常用的操作
2.1 map中的建構函式
map(); // 預設建構函式
map(const map& m) // 拷貝建構函式
map(iterator begin, iterator end ); //區間建構函式
map(iterator begin, iterator end, const traits& _compare) //帶比較謂詞的建構函式
map(iterator begin, iterator end, const traits& _compare, const allocator& all) //帶分配器
經過分析我們發現,map的建構函式主要是呼叫「拷貝建構函式」和利用「迭代器」進行初始化兩種方式。我想原因是很簡單的,因為,map中每個節點由一對值構成。這裡還用寫乙個程式演示一下map的建構函式嗎?
2.2 map中的一些基礎函式
begin,end,rbegin,rend,empty,clear,size,max_size。八個常用的函式,看到名字應該就知道怎麼用了吧,看看**:
執行結果:
2.3 map中的的查詢元素
map中用來查詢的函式是find,但是能完成查詢功能的函式卻並不止這乙個,比如count也是可以完成查詢的,因為map中的鍵值是不允許重複的,所以乙個鍵值只能出現一次,這說明count的返回值就只能是0或1了,那麼顯然這就能完成查詢了,但是用count來完成查詢並不是最優的選擇,因為原來的本意是用count來完成計數的,這在vector等序列式容器中是灰常好用的,而map中之所以有這個count函式,就是為了stl提供統一的介面,這樣說來map中的upper_bound和lower_bound,equel_range等函式組合起來也是可以完成查詢功能的(想一想怎麼實現)。這裡有個疑問:count和find對於完成的效率是不是一致的呢??
我們分別看看分別用find和count來完成查詢:
執行結果:
find success !!
count success !!
看到了嗎,count和find還是有區別的,那就是count只能單純的查詢元素是否存在,而find能定位要查詢元素的位置。有一點需要注意的是查詢的引數是鍵值哦!!
2.4 map中資料的插入和刪除
無論是對於哪個容器,插入和刪除都是非常重要的操作,先說一說map中資料的插入,資料的插入大概有三種方式,第一種:insert(pair(key1,value1))。
第二種:insert(map::value_type(key1,value1)),這種插入方式和第一種基本相似。第三種:利用陣列進行插入,這個一會用程式演示吧。
關於資料的刪除,大概有三種方式進行刪除:第一種:erase(map::iterator iter),刪除迭代器所指的節點。第二種:erase(key k),根據鍵值進行刪除,刪除鍵值k所指的節點 。第三種:erase(map::iteratormap iter1,::iteratoriter2),刪除iter1和iter2之間的資料。
執行結果:
注意:通過觀察輸出結果,利用陣列進行插入對資料進行了覆蓋,而其他兩種插入方式沒有進行覆蓋,實際上屬於插入失敗,還要注意的是,利用陣列進行插入下標實際上是鍵值。
2.5 其他一些常用的函式或運算子
比如swap和key_comp函式,還有操作符:==,!=,,>=等,對於==運算子,只有兩個map中所有的元素完全一致,才說兩個map相等,而,>=起著決定作用的是兩個map第乙個不同的元素,這和string庫中的strcmp相似。這些東西就不多說了。。
STL中的map容器的一點總結
stl中的map容器的一點總結 一 關於map的介紹 map是stl的乙個容器,和set一樣,map也是一種關聯式容器。它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能力,由於這個特性,有助於我們處理一對一資料。這裡說下map內部資料...
STL中map容器的一點點用法
1.map最基本的建構函式 mapmapstring mapmapint mapmapstring map char string mapchar mapmapchar mapmapint 2.map新增資料 mapmaplive 1.maplive.insert pair 102,aclive 2...
STL中的set容器的一點總結
1.關於set c stl 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector,string,list等方便的容器,更重要的是stl封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了鍊錶,map和set封裝了二叉樹等,在封裝這些資料結構的時候,s...