C 篇 關聯容器Set和MultiSet

2021-09-25 20:39:47 字數 3353 閱讀 7865

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元素的排列規則...