2008-11-12 105 views

回答

11

是的,算法標題中有一個set_difference函數。

編輯:

FYI,所述一組數據結構能夠有效地使用該算法,如在其documentation說明。該算法不僅適用於集合,而且適用於排序集合上的任何迭代器對。

正如其他人所說,這是一種外部算法,而不是一種方法。推測這對你的應用程序來說很好。

+1

這是對_any_對有序容器的使用。 – xtofl 2008-11-12 14:16:15

+0

好點...我在編輯中添加了一個註釋。 – 2008-11-12 14:43:32

1

不是作爲一種方法,但有外部算法功能set_difference

template <class InputIterator1, class InputIterator2, class OutputIterator> 
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, 
           InputIterator2 first2, InputIterator2 last2, 
           OutputIterator result); 

http://www.sgi.com/tech/stl/set_difference.html

119

是的,它在<algorithm>,被稱爲:std::set_difference。用法:

#include <algorithm> 
#include <set> 
#include <iterator> 
// ... 
std::set<int> s1, s2; 
// Fill in s1 and s2 with values 
std::set<int> result; 
std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), 
    std::inserter(result, result.end())); 

最後,設定result將包含s1-s2

+0

+1。 不幸的是,當我需要的時候,我放棄了自己的循環( – peterchen 2008-11-12 14:52:22

+38

),如果你在非關聯容器類上使用set_difference,比如說一個向量,確保兩個容器中的元素都先排序... ? – paxos1977 2008-11-13 01:06:12

2

所選答案是正確的,但有一些語法錯誤。

而不是

#include <algorithms> 

使用

#include <algorithm> 

而不是

std::insert_iterator(result, result.end())); 

使用

std::insert_iterator<set<int> >(result, result.end())); 
0

我們可以只使用

set_difference(set1.begin(), set1.end(), set2.begin(). set2,end(),std::back_inserter(result)). 
1

再次,提高救援:

#include <string> 
#include <set> 
#include <boost/range/algorithm/set_algorithm.hpp> 

std::set<std::string> set0, set1, setDifference; 
boost::set_difference(set0, set1, std::inserter(setDifference, setDifference.begin()); 

setDifference將包含SET0,SET1。

0

C++沒有定義一組差分算子,但你可以定義自己的(使用其它響應給定的代碼):

template<class T> 
set<T> operator -(set<T> reference, set<T> items_to_remove) 
{ 
    set<T> result; 
    std::set_difference(
     reference.begin(), reference.end(), 
     items_to_remove.begin(), items_to_remove.end(), 
     std::inserter(result, result.end())); 
    return result; 
}