C 之map和unordered map詳解

2021-10-07 05:25:45 字數 4877 閱讀 6954

簡介:c++中map和unordered_map提供的是一種鍵值對容器,所有的資料都是成對出現的,每一對中的第乙個值稱之為關鍵字(key),每個關鍵字只能在map**現一次;第二個稱之為該關鍵字的對應值(value),一對一的對映。

一.map:有序性,可應用於有順序要求的應用中 ;unordered_map:雜湊表保證了元素的查詢和儲存速度都非常的快

二.map:空間佔用率高,紅黑樹的每個節點都需要儲存父節點、子節點和紅黑性質,增加了使用空間;

unordered_map:雜湊表的建立比較耗時

include using namespace std;

// map的構造方法1

mapmap1;

map1['a'] = 88;

map1['b'] = 90;

map1['c'] = 85;

// 2

mapmap2(map1.begin(), map1.end());

//3mapmap3(map2);

name

description

begin

返回指向迭代器第乙個元素的迭代器

end返回指向迭代器最後乙個元素的迭代器

rbegin

返回逆序迭代器第乙個元素的迭代器

rend

返回迭代器逆序最後乙個元素的迭代器

cbegin

返回常量迭代器的第乙個元素的迭代器

cend

返回常量迭代器的最第乙個元素的迭代器

crbegin

返回常量迭代器逆序的第乙個元素的迭代器

crend

返回常量迭代器逆序的最後乙個元素的迭代器

int main() 

for (auto it2 = map1.rbegin(); it2 != map1.rend(); ++it2)

return 0;

}

獲取元素可以適用和at,如果我們索引的key並不在map物件裡面,則

會將這個key儲存到map物件中,對應的value是該型別對應的初始化值;

at會丟擲異常

map1[

'a']=97

;map1[

'b']=98

;map1[

'c']=99

;cout << map1[

'd']

<< endl;

//將map1['d']=0新增到物件中

cout << map1.at(

'e')

<< endl;

// 丟擲異常

其他一些方法

find

若找到該key,返回該位置的迭代器;否則返回map::end的迭代器

count

包含元素計數,返回值為0或1

lower_bound

返回指向所取元素的迭代器

upper_bound

返回指向所取元素下乙個元素的迭代器

equal_bound

返回乙個pair,pair的第乙個內容是lower_bound的結果pair的第二個內容是upper_bound的結果

//find

map<

char

,int

>

::iterator it;

it = map.

find

('b');

cout << it-

>second << endl;

//99

cout << map.

count

('a'

)<< endl;

// 1

cout << map.

count

('e'

)<< endl;

// 0

map1[

'a']=97

; map1[

'b']=98

; map1[

'c']=99

; map1[

'd']

=100

; map1[

'e']

=101

;map<

char

,int

>

::iterator itlow, itup;

itlow = map1.

lower_bound

('b');

// itlow points to b

itup = map1.

upper_bound

('d');

// itup points to e

map1.

erase

(itlow, itup)

;// 剩下a 和 e

map1.

insert

(pair<

char

,int

>

('d'

,100))

;//a,e,d都有

map1.

erase

('a');

//剩下e,d

map1.

clear()

;//清空,但儲存空間依舊存在

equal_bound

map1[

'a']=97

; map1[

'b']=98

; map1[

'c']=99

;

pairchar

,int

>

::iterator, map<

char

,int

>

::iterator> ret;

ret = map1.

equal_range

('b');

//返回乙個lower_bound和乙個upper_bound

cout << ret.first-

>first <<

"=>"

<< ret.first-

>second << endl;

// b=>20

cout << ret.second-

>first <<

"=>"

<< ret.second-

>second << endl;

// c=>30

swap:

map<

char

,int

> foo, bar;

//交換兩個map的內容

foo[

'x']

=100

; foo[

'y']

=200

; bar[

'a']=10

; bar[

'b']=20

; bar[

'c']=30

; foo.

swap

(bar)

;

emplace:直接在後面插入元素,不負責排序,因此速度比insert更快

map1.

emplace

('x'

,100);

map1.

emplace

('y'

,200

);

模板

template

<

class

key,

//鍵值對中鍵的型別

classt,

//鍵值對中值的型別

class

hash

= hash

,//容器內部儲存鍵值對所用的雜湊函式

class

pred

= equal_to

,//判斷各個鍵值對鍵相同的規則

class

alloc

= allocator< pair<

const key,t>

>

// 指定分配器物件的型別

>

class

unordered_map

;

總的來說,當無序容器中儲存鍵值對的鍵為自定義型別時,預設的雜湊函式 hash 以及比較函式 equal_to 將不再適用,只能自己設計適用該型別的雜湊函式和比較函式,並顯式傳遞給 hash 引數和 pred 引數。至於如何實現自定義,後續章節會做詳細講解。

#include

using

namespace std;

unordered_mapint> strintmap;

strintmap map1;

strintmap map2(,

});strintmap map3

(map2)

;strintmap map4

(map3.

begin()

, map3.

end())

;unordered_map

umap2

(++umap.

begin()

,umap.

end())

;//通過此方式建立的 umap2 容器,其內部就包含 umap 容器中除第 1 個鍵值對外的所有其它鍵值對。

//下面實現一些方法

#include

#include

#include

using

namespace std;

intmain()

return0;

}

C 學習之map型別

1。目錄 map簡介 map的功能 map的定義 在map中新增元素 查詢並獲取map中的元素 從map中刪除元素 map物件的迭代遍歷 2。map簡介 map是一類關聯式容器,它是模板類。關聯的本質在於元素的值與某個特定的鍵相關聯,而並非通過元素在陣列中的位置類獲取。它的特點是增加和刪除節點對迭代...

C 學習之map型別

1。目錄 map簡介 map的功能 map的定義 在map中新增元素 查詢並獲取map中的元素 從map中刪除元素 map物件的迭代遍歷 2。map簡介 map是一類關聯式容器,它是模板類。關聯的本質在於元素的值與某個特定的鍵相關聯,而並非通過元素在陣列中的位置類獲取。它的特點是增加和刪除節點對迭代...

C 學習之map型別

1。目錄 map簡介 map的功能 map的定義 在map中新增元素 查詢並獲取map中的元素 從map中刪除元素 map物件的迭代遍歷 2。map簡介 map是一類關聯式容器,它是模板類。關聯的本質在於元素的值與某個特定的鍵相關聯,而並非通過元素在陣列中的位置類獲取。它的特點是增加和刪除節點對迭代...