C map 映照容器

2022-03-16 03:31:18 字數 4177 閱讀 2324

map映照容器的元素資料是乙個鍵值和乙個映照資料組成的,鍵值與映照資料之間具有一一映照的關係。

map映照容器的資料結構是採用紅黑樹來實現的,插入鍵值的元素不允許重複,比較函式只對元素的鍵值進行比較,元素的各項資料可通過鍵值檢索出來。

使用map容器需要標頭檔案包含語句「#include

」, map檔案也包含了對multimap多重映照容器的定義。

1、map建立、元素插入和遍歷訪問

建立map物件,鍵值與映照資料的型別由自己定義。在沒有指定比較函式時,元素的插入位置是按鍵值由小到大插入到黑白樹中去的,下面這個程式詳細說明了如何操作map容器。

1#include 2#include

3#include 4

5using

std :: cout ;

6using

std :: endl ;

7using std :: string; 8

using

std :: map ; 9

10int

main()

1126

27return0;

28}29執行結果:

bomi :

96jack :

98.5

kate :

97.5

程式編譯試,會產生代號為「warning c4786」 的警告, 「

4786」 是標記符超長警告的代號。可以在程式的標頭檔案包含**的前面使用"

#pragma waring(disable:4786)

"巨集語句,強制編譯器忽略該警告。4786號警告對程式的正確性和執行並無影響。

2、刪除元素

map映照容器的 erase() 刪除元素函式,可以刪除某個迭代器位置上的元素、等於某個鍵值的元素、乙個迭代器區間上的所有元素,當然,也可使用clear()方法清空map映照容器。

下面這個程式演示了刪除map容器中鍵值為28的元素:

1#include 2#include

3#include 4

5using

std :: cout ;

6using

std :: endl ;

7using std :: string; 8

using

std :: map ; 9

10int

main()

1128

return0;

29}30執行結果:

10: x

25: m

30: a

3、元素反向遍歷

可以用反向迭代器reverse_iterator反向遍歷map映照容器中的資料,它需要rbegin()方法和rend()方法指出反向遍歷的起始位置和終止位置。

1#include 2#include

3#include 4

5using

std :: cout ;

6using

std :: endl ;

7using std :: string; 8

using

std :: map ; 9

10int

main()

1126

return0;

27}28執行結果:

30: a

28: k

25: m

10: x

4、元素的搜尋

使用find()方法來搜尋某個鍵值,如果搜尋到了,則返回該鍵值所在的迭代器位置,否則,返回end()迭代器位置。由於map採用黑白樹資料結構來實現,所以搜尋速度是極快的。

下面這個程式搜尋鍵值為28的元素:

1#include 2#include

3#include 4

5using

std :: cout ;

6using

std :: endl ;

7using std :: string; 8

using

std :: map ; 9

10int

main()

1127

5、自定義比較函式

將元素插入到map中去的時候,map會根據設定的比較函式將該元素放到該放的節點上去。在定義map的時候,如果沒有指定比較函式,那麼採用預設的比較函式,即按鍵值由小到大的順序插入元素。在很多情況下,需要自己編寫比較函式。

編寫方法有兩種。

(1)如果元素不是結構體,那麼,可以編寫比較函式。下面這個程式編寫的比較規則是要求按鍵值由大到小的順序將元素插入到map中

1#include 2#include

3#include 4

5using

std :: cout ;

6using

std :: endl ;

7using std :: string; 8

using

std :: map ; 9

10//

自定義比較函式 mycomp

11struct

mycomp

1218

} ;19

20int

main()

2135

執行結果:

30:a

28:k

25:m

10:x

(2)如果元素是結構體,那麼,可以直接把比較函式寫在結構體內。下面的程式詳細說明了如何操作:

1#include 2#include

3#include 4

5using

std :: cout ;

6using

std :: endl ;

7using std :: string; 8

using

std :: map ; 9

10struct

info

1120

} ;21

22int

main()

2345

return0;

46}47執行結果:

10 :bomi 80

30 :peti 66.5

25 :jack 60

6、用map實現數字分離

對數字的各位進行分離,採用取餘等數學方法是很耗時的。而把數字當成字串,使用map的映照功能,很方便地實現了數字分離。下面這個程式將乙個字串中的字元當成數字,並將各位的數值相加,最後輸出各位的和。

1#include

2#include 3#include 4

5using

std :: cout ;

6using

std :: endl ;

7using std :: string; 8

using

std :: map ; 9

10int

main()

1131

*/32

string

sa, sb ;

33 sa = "

6234";

34int

i ;35

int sum = 0;36

for ( i = 0 ; i < sa.length() ; i++)

37 sum +=m[sa[i]] ;

38 cout << "

sum =

"<< sum <39return0;

40}417

、數字映照字元的map寫法

在很多情況下,需要實現將數字對映為相應的字元,看看下面的程式:

1#include

2#include 3#include 4

5using

std :: cout ;

6using

std :: endl ;

7using std :: string; 8

using

std :: map ; 9

10int

main()

1131

*/32

int n = 7;33

string s = "

the number is ";

34 cout << s + m[n] <35return0;

36}37執行結果:

the number

is7

重寫比較器貌似只能針對key重寫,value好像不行

Map映照容器

1 map映照容器 map建立元素插入和遍歷訪問 建立map物件 鍵值與映照資料的型別自己定義 在預設比較函式下 元素的插入按鍵值小到大 include include include include include include include include include include i...

C STL之map映照容器

map映照容器的元素資料報含兩個部分 乙個鍵值 乙個映照的資料 組成的,鍵值和映照資料之間具有一一對應的關係。map映照容器的資料結構也是採用紅黑樹來實現的,請注意 不允許插入元素的鍵值相同。比較函式所比較的也只是鍵值之間的比較,在檢索的時候,通俗的說查詢的時候,還是通過鍵值進行查詢。map的用法和...

C map容器複習

迭代器作用 檢查容器內元素 訪問元素,是一種資料型別。與下標操作的比較 所有標準庫容器都有對應的迭代器型別,但只有少數容器支援下標操作。迭代器應用更廣泛。定義 如vector iterator iter iter的資料型別是由vector定義的iterator型別。iterator是容器型別的成員函...