例項講解,set,multiset,map,multimap關聯容器
阿新 • • 發佈:2019-01-24
測試環境:windows 7 vs2010
內部元素有序排列,新元素插入的位置取決於它的值,查詢速度快。
除了各容器都有的函式外,還支援以下成員函式:
find: 查詢等於某個值的元素(x小於y和y小於x同時不成立即為相等)
lower_bound: 查詢某個下界
upper_bound: 查詢某個上界
equal_range: 同時查詢上界和下界
count:計算等於某個值的元素個數(x小於y和y小於x同時不成立即為相等)
insert: 用以插入一個元素或一個區間
在學習關聯容器之前,我們先要學習pair模板,pair模板是struct形式,因此其內部成員預設都是公有的。
值得強調的是map/multimap容器中存放的都是pair物件,且按照first成員變數從小到大排序的。template<class _T1, class _T2> //兩個型別引數 struct pair { typedef _T1 first_type;//_T1定義成first_type,_T2定義成second_type typedef _T2 second_type; _T1 first; //first 是_T1 型別 _T2 second; //seconde 是_T2型別 pair(): first(), second() { } //無參建構函式 pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) { }// 分別用__a初始化first,__b去初始化second template<class _U1, class _U2> //這是一個模板函式建構函式,其通過一個pair物件去初始pair物件的first和second物件 pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) { } };
第三個建構函式例項
pair<int,int>
p(pair<double,double>(5.5,4.6));
// p.first = 5, p.second = 4
下面看下set和multiset(set和multiset區別在set不允許有重複的key值)
template<class Key, class Pred= less<Key>, class A = allocator<Key> > class multiset{ …… };
Pred型別的變數決定了multiset中的元素,“一個比另一個小”是怎麼定義的。multiset執行過程中,比較兩個元素x,y的大小的做法,就是生成一個Pred型別的變數,假定為op,若表示式op(x,y) 返回值為true,則x比y小。
Pred的預設型別是less<Key>。
//less模板是靠< 來比較大小的 ,因此當key為類時候,則該類必須過載運算子template<class T> structless : public binary_function<T, T, bool> { bool operator()(const T& x, const T& y) const { return x <y; } };
#include<iostream>
#include<set>
using namespace std;
void main()
{
set<int>::iterator setIter;
pair<set<int>::iterator,set<int>::iterator> mypair;
pair<set<int>::iterator,bool> result;
set<int> myset;
for(int i=0;i<10;i++)
{
myset.insert(i);
}
result=myset.insert(3);//set insert返回pair物件 而multiset返回迭代器
if(!result.second)
{
cout<<"3 已經存在"<<endl;
}
setIter=myset.find(2);//find函式返回迭代器
if(setIter!=myset.end())
{
cout<<*setIter<<endl;
}
else
{
cout<<"not find"<<endl;
}
mypair=myset.equal_range(4);//同時求得lower_bound和upper_bound
cout<<"lower_bound:"<<*mypair.first<<endl;
cout<<"upper_bound:"<<*mypair.second<<endl;
for(setIter=myset.begin();setIter!=myset.end();)
{
if(*setIter%2==0) //刪除偶數
{
setIter=myset.erase(setIter);
}
else
{
setIter++;
}
}
cout<<"刪除偶數後"<<endl;
for(setIter=myset.begin();setIter!=myset.end();setIter++)
{
cout<<*setIter<<endl;
}
cin.get();
}
map/multimap裡放著的都是pair模版類的物件,且按first從小到大排序,其中map中key不允許重複。
multimap
template<classKey, class T, class Pred= less<Key>,
class A = allocator<T> >
class multimap{
….
typedefpair<const Key, T> value_type;
…….
}; //Key 代表關鍵字的型別
multimap中的元素由<關鍵字,值>組成,每個元素是一個pair物件,關鍵字就是first成員變數,其型別是Key
multimap中允許多個元素的關鍵字相同。元素按照first成員變數從小到大排列,預設情況下用less<Key>定義關鍵字的“小於”關係。
#include<iostream>
#include<map>
using namespace std;
void main()
{
map<int,string> stu_name;// 編號 姓名 其中是按照編號排序 其是鍵值對
map<int,string>::iterator mapIter;
stu_name.insert(map<int,string>::value_type(1,"zhang san"));
stu_name.insert(map<int,string>::value_type(2,"li si"));
stu_name.insert(make_pair(3,"wang er")); //使用make_pair也行
mapIter=stu_name.find(2);//
if(mapIter!=stu_name.end())
{
cout<<mapIter->second.c_str()<<endl;
}
else
{
cout<<"not find"<<endl;
}
for(mapIter=stu_name.begin();mapIter!=stu_name.end();mapIter++)
{
cout<<mapIter->first<<":"<<mapIter->second.c_str()<<endl;
}
cin.get();
}