stl中定義的set要求元素不得重複且已經排序。而set演算法要求的都是有序區間(輸出也是有序的),但元素可以重複出現。
stl提供了4個set相關的演算法,分別是並集(union)、交集(intersection)、差集(difference)和對稱差集(symmetric difference),這4個演算法接受的set必須是有序區間,都至少接受4個引數,分別表示兩個set區間。一般而言,set演算法前4個引數分別表示兩個區間,第五個引數表示存放結果的區間的起始位置。
1、set_union
求兩個集合的並集,能夠造出s1 u s2,此集合內含s1或s2內的每乙個元素。如果某個值在s1出現n次,在s2出現m次,那麼該值在輸出區間中會出現max(m, n)次。
返回值為乙個迭代器,指向輸出區間的尾端。
是一種穩定操作,輸入區間內的每個元素相對順序都不會改變。
//並集,求存在於[first1, last1)或存在於[first2, last2)內的所有元素
//注意:輸入區間必須是已排序
//版本一,預設是operator《操作的排序方式
template outputiterator set_union(inputiterator1 first1, inputiterator1 last1,
inputiterator2 first2, inputiterator2 last2,
outputiterator result)
else
if (*first2
< *first1)
else
++result;
} /*只要兩區間之中有乙個區間到達尾端,就結束上面的while迴圈
以下將尚未到達尾端的區間剩餘的元素拷貝到目標區
此刻,[first1, last1)和[first2, last2)至少有乙個是空區間*/
return copy(first2, last2, copy(first1, last1, result));
} //版本二,使用者根據仿函式comp指定排序規則
template outputiterator set_union(inputiterator1 first1, inputiterator1 last1,
inputiterator2 first2, inputiterator2 last2,
outputiterator result, compare comp)
else
if (comp(*first2, *first1))
else
++result;
} return copy(first2, last2, copy(first1, last1, result));
}
2、set_intersection
求兩個集合的交集,此集合內含同時出現於s1和s2內的每乙個元素。如果某個值在s1出現n次,在s2出現m次,那麼該值在輸出區間中會出現min(m, n)次,並且全部來自s1。
返回值為乙個迭代器,指向輸出區間的尾端。
是一種穩定操作,輸入區間內的每個元素相對順序都不會改變。
3、set_difference
求兩個集合的差集,此集合內含出現於s1但不出現於s2內的元素。如果某個值在s1出現n次,在s2出現m次,那麼該值在輸出區間中會出現max(n-m, 0)次,並且全部來自s1。
返回值為乙個迭代器,指向輸出區間的尾端。
是一種穩定操作,輸入區間內的每個元素相對順序都不會改變。
4、set_symmetric_difference
求兩個集合的對稱差集(s1-s2)∪(s2-s1),此集合內含出現於s1但不出現於s2內的元素,以及出現於s2但不出現於s1內的每乙個元素。如果某個值在s1出現n次,在s2出現m次,那麼該值在輸出區間中會出現|n-m|次。
返回值為乙個迭代器,指向輸出區間的尾端。
是一種穩定操作,輸入區間內的每個元素相對順序都不會改變。
示例
#include
#include
#include
#include
using
namespace
std;
template
struct display
};
int main();
int ib = ;
multiset
s1(begin(ia), end(ia));
multiset
s2(begin(ib), end(ib));
for_each(s1.begin(), s1.end(), display());
cout
<< endl;
for_each(s2.begin(), s2.end(), display());
cout
<< endl;
multiset
::iterator first1 = s1.begin();
multiset
::iterator last1 = s1.end();
multiset
::iterator first2 = s2.begin();
multiset
::iterator last2 = s2.end();
cout
<< "union of s1 and s2:";
set_union(first1, last1, first2, last2, ostream_iterator(cout, " "));
cout
<< endl;
cout
<< "intersection of s1 and s2:";
set_intersection(first1, last1, first2, last2, ostream_iterator(cout, " "));
cout
<< endl;
cout
<< "difference of s1 and s2:";
set_difference(first1, last1, first2, last2, ostream_iterator(cout, " "));
cout
<< endl;
cout
<< "symmetric differenceof s1 and s2:";
set_symmetric_difference(first1, last1, first2, last2, ostream_iterator(cout, " "));
cout
<< endl;
return
0;
}
stl set使用模板
明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 100 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 與 排序 ...
STLset容器排序
學習目標 set容器預設排序規則為從小到大,掌握如何改變排序規則 主要技術點 利用仿函式,可以改變排序規則 示例一 include include using namespace std set容器排序 class mycompare void test01 cout endl 指定排序規則為從小到...
STL set 列車排程
火車站的列車排程鐵軌的結構如下圖所示。figure 兩端分別是一條入口 entrance 軌道和一條出口 exit 軌道,它們之間有n條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則...