關聯容器的實現原理是紅黑二叉樹
關聯容器的每個元素都有乙個鍵(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 ...