map 和 pair 同樣屬於一種不是特別常用的的stl容器,
但確實比 set 常用得多
兩者都是有兩個關鍵字的stl
且可以將 pair 型別插入 map 中
又或者說 map 就是由一堆 pair 組成的
且這些 pair 所表示的兩個資料型別分別相同
類似於變數和陣列的關係
map 物件是模板類,需要關鍵字和儲存物件兩個模板引數
它可以將不同的資料型別鏈結起來
比如可以把「student1」作為乙個陣列元素的下標來訪問這個元素的值
看起來功能很強大(大霧
那現在讓我們來康康 map 和 pair 到底怎麼使用叭。
map 可以理解為乙個功能更加 nb(時間和空間也更大)的二維陣列(其實裡面裝的是一棵紅黑樹),而且這顆紅黑樹內部具有對資料自動排序的特點,常數也在可以接受的範圍內
它的功能主要是可以連線不同的資料型別
比如字串 -> 整形,結構體 -> 浮點數,甚至還可能有 map -> set
聽起來難以理解對吧,
那好,讓我們舉個例子
首先看一下如何定義乙個 map
先是祖傳操作:stl 呼叫庫
//stl容器祖傳操作了
#include #include
#include
#include
//可別光include,map所需兩種資料型別也要呼叫
using
namespace
std;
mapstdname;
intmain()
這樣就宣告了乙個 int->string 的 map 了
其實就是乙個用 int 做引索,指向乙個 string 類的指標
就像一張圖中的一條邊一樣(大概是無權圖吧
map 中的元素是有聯絡的
那我們這裡介紹一下表示 map 中關係的一種資料型別
就是剛才講到的 pair(中就包含了 pair 的標頭檔案 < utility > ,所以無需再寫
pair 中只包含兩個元素:first 和 second
兩個元素的資料型別可以不同
定義 pair 的方式與 map 幾乎無差:
#include #include#include
#include
using
namespace
std;
intmain()
輸出結果是
jxc 150
看起來很好理解叭
你也可以將 pair 看成乙個只能含有兩個元素的結構體
事實上確實如此
而且 pair 單獨拿出來用很可能比結構體還難受
不過不要忘了我們本文真正的主角— map
通常情況下(其實用的不算太多
pair 一直是作為插入 map 的工具(中間商?賺常數(大霧))而存在的
對於兩個已有的物件,可以使用 make_pair 命令將兩個元素合成乙個 pair
int a = 8;string m = "
james";
pair
newone;
newone = makepair(a, m);
可以對 map 使用 insert 命令來插入乙個 pair,前提是 pair 的兩個資料型別分別與 map 所需要的資料型別相同
看一下如何插入乙個 pair 到乙個 map 中去
mapmapstudent;mapstudent.insert(pair
(1, "
student_one
"));
mapstudent.insert(pair
(2, "
student_two
"));
mapstudent.insert(pair
(3, "
student_three
"));
map::iterator iter;
for(iter = mapstudent.begin(); iter != mapstudent.end(); iter++)
cout
'分析一下這段**
其實就是在 insert 命令中宣告了 3 個不同的(但是兩個元素型別分別相同的pair)
然後將其插入名為 mapstudent 的 map 中
建立起了三個一一對映
這裡要記住
跟其他 stl 容器一樣
祖傳函式size, empty, clear, begin, end等用法都大差不差
這裡也不再過多做介紹
stl 中祖傳的迭代器也在 map 中得以實現
和 set 一樣都為雙向訪問迭代器
支援讀和寫以及自增和自減運算
宣告方式依然是 stl 祖傳的 iterator
map:: iterator it = mp.begin( );
除了剛才提到的 insert 命令(這貨只能插入 pair)
erase 函式也可以用來進行插入操作
比 insert 更強的是 erase 可以通過迭代器進行插入,也可以直接插入 pair
用法也與其他 stl 大差不差
最後壓軸的是 find 函式
find( x ) 可以通過 x 查詢 map 中第二個型別(key)與之對應的乙個二元組並返回其迭代器
重頭戲終於要來了
map 最 nb 最吸引人的地方
是 map 可以使用[ ]進行訪問
哦你問我[ ]這貨是啥?咋用?
哇老哥,你還沒用過陣列嘛
沒想到吧,map 可以像陣列一樣進行訪問
類似於可以用字串當下標來訪問元素
和陣列一樣,map 也可以通過陣列下標來進行資料修改與加和
類似 mp[student1] = 150;這樣的神奇操作
可以實現快速的一一對應,有時還可以用來做 hash
我們依此可以很方便地通過 key 找到 value
特別的是
如果沒有這個 key 也就是查詢不到的話
map 中會自動新建乙個 pair 儲存 (key, zero)
這裡的 zero 表示的是廣義的0
可以是空字元,數字0,空串等等等等
長此以往會佔據大量空間
所以建議使用[ ]前先 find 一下看看有沒有這個二元組以避免空間冗餘
~end~
C 知識點 STL容器2 set
set可能算是一種比較冷門的stl容器了,喜歡用它的人覺得set真牛逼 不喜歡它的人覺得set真垃圾 很不幸,我屬於第一種 set作為一種封裝好的資料容器 最吸引人的地方是它的自動排序功能 這也就是說你可以擁有乙個實時的排好序的序列 或者可以用乙個序列同時實現大根堆和小根堆 時間複雜度和空間都是兩者...
C 知識點 STL容器1 vector
vector可能是與各位選手見面次數最多的stl容器了 這是因為它在圖論問題中發揮的特殊而重要的作用 簡單來說vector就是乙個能根據需求改變自己長度的陣列 它有乙個空間的初始值,一旦初始值滿則向記憶體申請兩倍的空間 同樣的,它支援像陣列一樣使用下標訪問,不是修改 也像陣列一樣不能o 1 在任意位...
知識點 C 中STL容器之set
零 stl目錄 1 容器之map 2 容器之vector 3 容器之set 一 前言 繼上期的vector之後,我們又迎來了另乙個類陣列的stl容器 set。二 用途與特性 set,顧名思義,集合,由數學知識可知,其內部每個元素最多出現一次。同時,系統能夠根據元素的值自動進行排序。和set一樣,mu...