c 的 set 和 multiset 容器

2022-08-21 21:15:11 字數 3784 閱讀 6412

set和multiset會根據特定的排序準則,自動將元素進行排序。不同的是後者允許元素重複而前者不允許。

需要包含標頭檔案:

#include

set和multiset都是定義在std空間裡的類模板:

template

_kty,

class _pr = less<_kty>,

class _alloc = allocator<_kty> >

class multiset

template

_kty,

class _pr = less<_kty>,

class _alloc = allocator<_kty> >

class multiset

只要是可復賦值、可拷貝、可以根據某個排序準則進行比較的型別都可以成為它們的元素。第二個引數用來定義排序準則。預設準則less是乙個仿函式,以operator《對元素進行比較。

所謂排序準則,必須定義strict weak ordering,其意義如下:

1、必須使反對稱的。

對operator《而言,如果x2、必須使可傳遞的。

對operator《而言,如果x3、必須是非自反的。

對operator《而言,x因為上面的這些特性,排序準則可以用於相等性檢驗,就是說,如果兩個元素都不小於對方,則它們相等。

set和multiset的功能

和所有關聯式容器類似,通常使用平衡二叉樹完成。事實上,set和multiset通常以紅黑樹實作而成。

自動排序的優點是使得搜尋元素時具有良好的效能,具有對數時間複雜度。但是造成的乙個缺點就是:

不能直接改變元素值。因為這樣會打亂原有的順序。

改變元素值的方法是:先刪除舊元素,再插入新元素。

訪問元素只能通過迭代器,從迭代器的角度看,元素值是常數。

操作函式

set的形式可以是:

set的程式練習:

#includeusing

namespace

std;

#include

#include

//1.集合 元素唯一 自動排序(預設情況是從小到大) 不能按照陣列的方式插入元素

//2.紅黑樹

void

main91()

//插入元素

set1.insert(100

); set1.insert(

100);

set1.insert(

100);

for (set

::iterator it = set1.begin(); it != set1.end(); it++)

cout

<

//刪除集合

while (!set1.empty())

}//對基本的資料型別能夠自動排序

void

main92()

//插入元素

set3.insert(100

); set3.insert(

100);

set3.insert(

100);

//遍歷 順序應是從大到小

for (set

> ::iterator it = set3.begin(); it != set3.end(); it++)

cout

<

對於複雜的資料型別 teacher student

class

student

public

:

char name[64

];

intage;

};//

仿函式struct

funcstudent

else

}};//

仿函式的用法

void

main93()

else

set1.insert(s2);

/*set1.insert(s3);

set1.insert(s4);

*/pair

::iterator, bool> it5 =set1.insert(s5);

if (it5.second == true

)

else

//如何知道插入的結果?

//pairinsert(const value_type& _val)

//如何判斷set1.insert函式的返回值

//遍歷

for (set

::iterator it = set1.begin(); it != set1.end(); it++)

cout

<

}void

main95()

for (set

::iterator it = set1.begin(); it != set1.end(); it++)

cout

<

set::iterator it0 =set1.find(5

); cout

<< "

it0:

"<< *it0 <

int num = set1.count(5);//

找值為5的個數

cout << "

mum:

"<< num <

set::iterator it3 = set1.upper_bound(3);//

大於3的元素迭代器位置

cout << "

大於3的迭代器位置

"<< *it3 <

set::iterator it4 = set1.lower_bound(3);//

大於等於3的元素迭代器位置

cout << "

大於等於3的迭代器位置

"<< *it4 <

pair

::iterator, set

::iterator> mypair = set1.equal_range(3);//

找大於等於3和大於三的迭代器位置

set::iterator it5 = mypair.first;//

3 cout << "

it5

"<< *it5 <

set::iterator it6 = mypair.second;//

4 cout << "

it6

"<< *it6 <

}int

main()

multiset用法:

#includeusing

namespace

std;

#include

void

main1001()

//遍歷

for (multiset::iterator it = set1.begin(); it != set1.end(); it++)

cout

<

while (!set1.empty())

}int

main()

STL複習(6)之set與multiset容器

1.set multiset屬於關聯式容器,底層結構是用二叉樹實現,所有元素會在插入時自動被排序 2.set和multiset區別 set不允許容器中有重複的元素 multiset允許容器中有重複的元素 3.構造和賦值 set st 預設建構函式 set const set st 拷貝建構函式 se...

C 篇 關聯容器Set和MultiSet

1.關聯容器內部是排好序的,排序的大小可以自己定義 2.關聯容器除了之前共有的成員函式,還有以下的成員函式 在學習關聯容器之前,要學習乙個預備知識 pair模板 它是stl內預習定義的類模板,map multimap容器裡放著的都是pair模版類的物件,且按first從小到大排序。templates...

set和multiset容器簡介

set和multiset容器簡介 開發工具與關鍵技術 c visualstudioset 是乙個集合容器,其中所包含的元素是唯一的,集合中的元素按一定的順序排列。它其他的 容器不同,它是不能指定位置插入的,它的元素插入過程是按排序規則插入的。set雖然不能指定位置插入,但是在插入和刪除操作較快,因為...