map是stl的乙個容器,和set一樣,map也是一種關聯式容器。它提供一對一(其中第乙個可以稱為關鍵字,每個關鍵字只能在map**現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,有助於我們處理一對一資料。這裡說下map內部資料的組織,map內部是自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對資料自動排序的功能,所以在map內部所有的資料都是有序的。學習map我們一定要理解什麼是一對一的資料對映?
比如:乙個班級中,每個學生的學號跟他的姓名就存在著一一對映的關係,這個模型用map可能輕易描述,很明顯學號用int 描述,姓名用字串描述採用的string,於是我們使用的map形式如下:mapstudent;
關於map和set底層實現以及效率問題,在另一篇《c++stl中set容器的一點總結》已經說了一些,map和set底層實現都是採用了平衡樹來實現的。這裡說一下map和set容器的區別。
對於map中的每個節點儲存的是一對資訊,包括乙個鍵和乙個值,各個節點之間的鍵值不能重複。對於map的學習,或者說是對stl中的容器的學習,要知道每種容器的實現原理,每種適合適合解決什麼問題的,才關鍵~~~~對於set中的每個節點儲存的是乙個資訊,只有乙個鍵,但是每個鍵值也是唯一的。set表示的是集合的概念。
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的用法和...