set和multiset會根據特定的排序準則,自動將元素進行排序。不同的是後者允許元素重複而前者不允許。
需要包含標頭檔案:
#include
set和multiset都是定義在std空間裡的類模板:
template_kty,
class _pr = less<_kty>,
class _alloc = allocator<_kty> >
class multiset
template只要是可復賦值、可拷貝、可以根據某個排序準則進行比較的型別都可以成為它們的元素。第二個引數用來定義排序準則。預設準則less是乙個仿函式,以operator《對元素進行比較。_kty,
class _pr = less<_kty>,
class _alloc = allocator<_kty> >
class multiset
所謂排序準則,必須定義strict weak ordering,其意義如下:
1、必須使反對稱的。
對operator《而言,如果x2、必須使可傳遞的。
對operator《而言,如果x3、必須是非自反的。
對operator《而言,x因為上面的這些特性,排序準則可以用於相等性檢驗,就是說,如果兩個元素都不小於對方,則它們相等。
set和multiset的功能
和所有關聯式容器類似,通常使用平衡二叉樹完成。事實上,set和multiset通常以紅黑樹實作而成。
自動排序的優點是使得搜尋元素時具有良好的效能,具有對數時間複雜度。但是造成的乙個缺點就是:
不能直接改變元素值。因為這樣會打亂原有的順序。
改變元素值的方法是:先刪除舊元素,再插入新元素。
訪問元素只能通過迭代器,從迭代器的角度看,元素值是常數。
操作函式
set的形式可以是:
set的程式練習:
#includeusingmultiset用法: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()
#includeusingnamespace
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雖然不能指定位置插入,但是在插入和刪除操作較快,因為...