STL單重關聯容器之集合(set)和對映(map)

2021-09-27 18:25:54 字數 4247 閱讀 6665

關聯容器的實現原理是紅黑二叉樹

關聯容器的每個元素都有乙個鍵(key),對乙個關聯容器s,使用迭代器在[s.begin(),s.end())區間內遍歷,訪問到的順序總是按鍵的大小公升序排列的。

按照容器中是否允許出現重複鍵值,可分為單重關聯容器(set和map)和多重關聯容器(multiset和multimap)。

按照鍵和元素的關係可以分為簡單關聯容器(set和multiset)和二元關聯容器(map和multimap)。

簡單關聯容器只有乙個型別引數,既是鍵型別又是容器型別(即set的元素型別就是鍵本身的型別

二元關聯容器有兩個型別引數,前乙個是鍵型別,後乙個是附加資料型別(即map的元素型別是「鍵-值」對的二元組型別

這種二元組型別可以用< utility >標頭檔案中的結構體模板pair實現:

pair結構體模板非常重要!!!

template

<

classt1,

class

t2>

struct pair

;

例如

maps;

則s中的每個元素都是pair型別的;(非常重要!!!)

訪問每個元素的鍵和附加資料(以訪問首元素的鍵和附加資料為例):

map<

int,

double

>

::iterator it=s.

begin()

;int key_out=it-

>first;

double data_out=it-

>second;

這裡的迭代器it就相當於結構體指標

例1:set的簡單使用

本例涉及的點:

1.set的元素型別是鍵本身

2.s.insert(t)函式的返回型別是pair< set::iterator,bool >,只有當沒有插入重複的鍵值時,才能成功插入。插入成功時,返回被插入元素的迭代器和true;插入失敗時,返回與t相同的鍵值的迭代器和false。

即:

pair< set<

double

>

::iterator,

bool

> r=s.

insert

(t);

所以當插入重複鍵值時,r.second為false。

其餘函式的詳細用法見書本(很簡單的)

3.由於鍵值按公升序排列

*s.begin()得到的元素總是最小的;*(--s.end())得到的元素總是最大的

#include

#include

//該標頭檔案中包含了pair的結構體模板

#include

#include

using

namespace std;

//集合的元素型別是鍵(key)本身

intmain()

set<

double

>

::iterator it1 = s.

begin()

; set<

double

>

::iterator it2 =

--s.

end();

double medium =

(*it1 +

*it2)/2

; cout <<

"<=medium"

<< endl;

copy

(s.begin()

, s.

upper_bound

(medium)

, ostream_iterator<

double

>

(cout,

" "));

cout << endl;

cout <<

">=medium"

<< endl;

copy

(s.lower_bound

(medium)

, s.

end(

), ostream_iterator<

double

>

(cout,

" "));

cout << endl;

system

("pause");

return0;

}

例2:map的使用(簡易選課程式)

本例涉及的點:

1.map的元素型別是「鍵-值」對的二元組型別

2.單重關聯容器的erase函式和find函式的使用

3.本例中在對映courses中儲存所有課程的資訊,每乙個元素的鍵是課程名,附加資料是學分,即每個元素的型別均為pair。向對映courses插入的操作為:courses.insert(pair("c++",2));

為了**的簡短,同樣這裡可以直接使用stl已有的函式模板make_pair自動識別鍵型別和值型別,它也在標頭檔案utility中定義:

template

<

classt1,

class

t2>

pair

make_pair

(t1 v1,t2 v2)

這樣,向對映courses插入的操作簡化為為:courses.insert(make_pair("c++",2));

#include

#include

#include

#include

#include

using

namespace std;

//在很多課程中任意選擇3門課,輸出三門課學分總和

intmain()

else

} cout <<

"total credit:"

<< sum << endl;

system

("pause");

return0;

}

例3.利用map對一句英文中的所有出現過的字母的個數進行統計

本例涉及的點:

1.map中過載了「[ ]」運算子——用來查詢和插入元素

若s為對映,鍵為k,則表示式s[k]執行的操作為:在s中查詢鍵為k的元素,如果這個鍵存在,則返回它的附加資料的引用;如果這個鍵不存在,則系統自動向s中插入乙個新元素,這個新元素的鍵為k,並返回該元素的附加資料,該附加資料的初值為t(),與使用動態記憶體分配操作new t()為堆物件產生的初值是一樣的

int *p=new int(),則初始的*p就是0

2.其實,和例2相比,發現「[ ]」雖然方便,但是還是不能取代insert和find函式,因為它會為新鍵自動建立新元素,無法實現find的功能。

#include

#include

#include

//isalpha和tolower

#include

using

namespace std;

intmain()

}while

(c !=

'.')

;for

(map<

char

,int

>

::iterator it1 = s.

begin()

; it1 != s.

end(

); it1++

) cout << endl;

system

("pause");

return0;

}

STL 關聯容器 之set 無重複有序集合

參考資料 std setfirst int myints std setsecond myints,myints 5 std setthird second std setfourth second.begin second.end struct classcomp 返回乙個二元組 pair 成員 ...

STL 關聯容器 之set 無重複有序集合

參考資料 參考資料 std setfirst int myints std setsecond myints,myints 5 std setthird second std setfourth second.begin second.end struct classcomp 返回乙個二元組 pai...

STL之關聯容器

1.set單重集合 不允許key重複 set作為乙個容器,也是用來儲存同一資料型別的資料型別,並且能從乙個資料集合中取出資料 c stl中標準關聯容器set,multiset,map,multimap內部採用的就是一種非常高效的平衡檢索二叉樹 紅黑樹 include using namespace ...