簡介: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是一類關聯式容器,它是模板類。關聯的本質在於元素的值與某個特定的鍵相關聯,而並非通過元素在陣列中的位置類獲取。它的特點是增加和刪除節點對迭代...