C 知識點 STL容器3 map pair

2022-04-07 10:37:50 字數 3268 閱讀 1358

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...