STL set相關演算法

2021-08-18 08:57:45 字數 3408 閱讀 7743

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趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則...