1.關聯容器內部是排好序的,排序的大小可以自己定義
2.關聯容器除了之前共有的成員函式,還有以下的成員函式
在學習關聯容器之前,要學習乙個預備知識:pair模板;
它是stl內預習定義的類模板,map/multimap容器裡放著的都是pair模版類的物件,且按first從小到大排序。
templatestruct pair
pair(const _t1& __a, const _t2& __b)
: first(__a), second(__b)
templatepair(const pair<_u1, _u2>& __p)
: first(__p.first), second(__p.second)
};
template,
class a = allocator<「key」> >
class multiset ;
pred型別的變數決定了multiset 中的元素,「乙個比另乙個小」是怎麼定義的。
multiset執行過程中,比較兩個元素x,y的大小的做法,就是生成乙個 pred型別的
變數,假定為 op,若表示式op(x,y) 返回值為true,則 x比y小。
pred的預設型別是 less<「key」>。
#include #include //使用multiset須包含此檔案
using namespace std;
template void print(t first, t last)
//定義乙個類
class a
friend bool operator< ( const a & a1, const a & a2 )
friend ostream & operator<< ( ostream & o, const a & a2 )
friend class myless;
};//定義比較的方法
struct myless
};typedef multisetmset1; //mset1用 "<"比較大小
typedef multisetmset2; //mset2用 myless::operator()比較大小
int main()
;mset1 m1;
m1.insert(a,a+size);
m1.insert(22);
cout << "1) " << m1.count(22) << endl; //輸出 1) 2
cout << "2) "; print(m1.begin(),m1.end()); //輸出 2) 4 8 19 22 22 33 40
//m1元素:4 8 19 22 22 33 40
mset1::iterator pp = m1.find(19);
if( pp != m1.end() ) //條件為真說明找到
cout << "found" << endl;
//本行會被執行,輸出 found
cout << "3) "; cout << * m1.lower_bound(22) << ","
<<* m1.upper_bound(22)<< endl;
//輸出 3) 22,33
pp = m1.erase(m1.lower_bound(22),m1.upper_bound(22));
//pp指向被刪元素的下乙個元素
cout << "4) "; print(m1.begin(),m1.end()); //輸出 4) 4 8 19 33 40
cout << "5) "; cout << * pp << endl; //輸出 5) 33
mset2 m2; // m2裡的元素按n的個位數從小到大排
m2.insert(a,a+size);
cout << "6) "; print(m2.begin(),m2.end()); //輸出 6) 40 22 33 4 8 19
return 0;
}//m1元素:4 8 19 22 22 33 40
mset1::iterator pp = m1.find(19);
if( pp != m1.end() ) //條件為真說明找到
cout << "found" << endl;
//本行會被執行,輸出 found
cout << "3) "; cout << * m1.lower_bound(22) << ","
<<* m1.upper_bound(22)<< endl;
//輸出 3) 22,33
pp = m1.erase(m1.lower_bound(22),m1.upper_bound(22));
//pp指向被刪元素的下乙個元素
cout << "4) "; print(m1.begin(),m1.end()); //輸出 4) 4 8 19 33 40
cout << "5) "; cout << * pp << endl; //輸出 5) 33
mset2 m2; // m2裡的元素按n的個位數從小到大排
m2.insert(a,a+size);
cout << "6) "; print(m2.begin(),m2.end()); //輸出 6) 40 22 33 4 8 19
return 0;
set內不能存在相同的元素(a不小於b且a不大於b成立即相同),要是插入相同的元素,則會忽略插入
set用法例項:
#include #include using namespace std;
int main() ;
setst(a,a+5); // st裡是 1 2 3 4 6
pair< it,bool> result;
result = st.insert(5); // st變成 1 2 3 4 5 6
if( result.second ) //插入成功則輸出被插入元素
cout << * result.first << " inserted" << endl; //輸出: 5 inserted
if( st.insert(5).second ) cout << * result.first << endl;
else
cout << * result.first << " already exists" << endl; //輸出 5 already exists
pairbounds = st.equal_range(4);
cout << * bounds.first << "," << * bounds.second ; //輸出:4,5
return 0;
}
關聯容器 set
set容器用來儲存同一資料型別的資料,並且能從乙個資料集合中取出資料,在set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序,set元素的值不能直接被改變。set容器內部採用一種非常高效平衡檢索二叉樹 紅黑樹 mset.begin 返回set容器的第乙個元素的迭代器 mset.end 返回...
C 關聯式容器(set)詳解
關聯容器與序列容器有著根本性的不同,序列容器的元素是按照在容器中的位置來順序儲存和訪問的,而關聯容器的元素是按關鍵元素來儲存和訪問的。關聯容器支援高效的關鍵字查詢與訪問。兩個主要的關聯容器型別是map與set。概念 set裡面每個元素只存有乙個key,它支援高效的關鍵字查詢操作。set對應數學中的 ...
關聯式容器 set和multiset
set的特性是,所有的元素都會根據元素的鍵值自動排序。set的元素不像map那樣可以同時擁有實值 value 和鍵值 key set元素的鍵值就是實值,實值就是鍵值。set不允許兩個元素擁有相同的鍵值。不能通過set的迭代器改變set的元素值,因為set元素的值就是其鍵值,關係到set元素的排列規則...