C STL容器總結篇之map

2021-10-10 17:15:25 字數 4258 閱讀 6808

map是stl的乙個容器,和set一樣,map也是一種關聯式容器。它提供一對一(其中第乙個可以稱為關鍵字,每個關鍵字只能在map**現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,有助於我們處理一對一資料。這裡說下map內部資料的組織,map內部是自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對資料自動排序的功能,所以在map內部所有的資料都是有序的。學習map我們一定要理解什麼是一對一的資料對映?

比如:乙個班級中,每個學生的學號跟他的姓名就存在著一一對映的關係,這個模型用map可能輕易描述,很明顯學號用int 描述,姓名用字串描述採用的string,於是我們使用的map形式如下:mapstudent;

關於map和set底層實現以及效率問題,在另一篇《c++stl中set容器的一點總結》已經說了一些,map和set底層實現都是採用了平衡樹來實現的。這裡說一下map和set容器的區別。

對於map中的每個節點儲存的是一對資訊,包括乙個鍵和乙個值,各個節點之間的鍵值不能重複。

對於set中的每個節點儲存的是乙個資訊,只有乙個鍵,但是每個鍵值也是唯一的。set表示的是集合的概念。

對於map的學習,或者說是對stl中的容器的學習,要知道每種容器的實現原理,每種適合適合解決什麼問題的,才關鍵~~~~

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的建構函式主要是呼叫「拷貝建構函式」和利用「迭代器」進行初始化兩種方式,因此就不逐個演示了。

begin

(),end

(),rbegin

(),rend

(),empty

(),clear

(),size

(),max_size()。

以上常用的函式,看到名字應該就知道怎麼用了吧,示例**如下:

#include

#include

using namespace std;

intmain()

cout << endl;

cout <<

"map 的 size 的值為:"

<< student.

size()

<< endl;

cout <<

"map 的 max_size 的值為:"

<< student.

max_size()

<< endl;

student.

clear()

;if(student.

empty()

)else

return0;

}

執行結果:

find函式和count函式在map中都能用來查詢,但因為map中的鍵值是不允許重複的,所以乙個鍵值只能出現一次,這說明count的返回值就只能是0或1了,那麼顯然這就能完成查詢了。但是用count來完成查詢並不是最優的選擇,因為原來的本意是用count來完成計數的,這在vector等序列式容器中是灰常好用的,而map中之所以有這個count函式,就是為了stl提供統一的介面,這樣說來map中的upper_bound和lower_bound,equel_range等函式組合起來也是可以完成查詢功能的(想一想怎麼實現)。這裡有個疑問:count和find對於完成的效率是不是一致的呢??

我們分別看看分別用find和count來完成查詢:

#include

#include

using namespace std;

intmain()

if(student.

count

(1002))

return0;

}

執行結果:

看到了嗎,count和find還是有區別的,那就是count只能單純的查詢元素是否存在,而find能定位要查詢元素的位置。有一點需要注意的是查詢的引數是鍵值哦!!

map中資料的插入,資料的插入大概有三種方式:

1.

insert

(pair

>

(key1,value1))2.

insert

(map::

value_type

(key1,value1)

)//這種插入方式和第一種基本相似

3. 利用陣列進行插入,這個一會用程式演示吧。

map中資料的刪除也有三種方式:

1.

erase

(map

::iterator iter)

//刪除迭代器所指的節點

2.erase

(key k)

//根據鍵值進行刪除,刪除鍵值k所指的節點

3.erase

(map

::iteratormap iter1,

::iteratoriter2)

//刪除iter1和iter2之間的資料

#include

#include

using namespace std;

intmain()

cout << endl;

//刪除演示

student[

1004]=

"小明"

;//演示刪除新增兩個資料

student[

1005]=

"小紅";

cout <<

"第一種刪除,迭代器刪除首資料:"

<< endl;

ite = student.

begin()

; student.

erase

(ite)

;for

(ite = student.

begin()

; ite != student.

end(

); ite++

) cout << endl;

cout <<

"第二種刪除,利用鍵值刪除map中的資料:"

<< endl;

student.

erase

(1004);

for(ite = student.

begin()

; ite != student.

end(

); ite++

) cout << endl;

cout <<

"第三種刪除,利用鍵利用範圍迭代器刪除map中的所有資料:"

注意:通過觀察輸出結果,利用陣列進行插入對資料進行了覆蓋,而其他兩種插入方式沒有進行覆蓋,實際上屬於插入失敗,還要注意的是,利用陣列進行插入下標實際上是鍵值。

參考部落格

c STL容器之map容器

1.map中所有的元素都是pair 2.pair元素中第乙個元素為key,第二個元素為value 3.所有元素都會根據鍵值自動排序 4.map中不允許有重複的鍵,multimap中允許有重複的鍵 優點 可以根據key快速的找到value 一 建構函式 mapmp map const map mp 二...

C STL 之容器篇

stl 是標準模板庫,由容器,演算法,迭代器和容器介面卡組成。容器有 vector 陣列,順序儲存 list 鍊錶,可以翻轉,可以在頭尾新增,insert快,不可用 和at deque vector和list 的居中版,一部分順序,一部分用鍊錶的形式儲存,記憶體使用更加合理 map,set 關聯式容...

C STL之map映照容器

map映照容器的元素資料報含兩個部分 乙個鍵值 乙個映照的資料 組成的,鍵值和映照資料之間具有一一對應的關係。map映照容器的資料結構也是採用紅黑樹來實現的,請注意 不允許插入元素的鍵值相同。比較函式所比較的也只是鍵值之間的比較,在檢索的時候,通俗的說查詢的時候,還是通過鍵值進行查詢。map的用法和...