2008-11-12 4 views

ответ

11

Да, в заголовке алгоритмов есть функция set_difference.

редактирует:

FYI, структура набора данных имеет возможность эффективно использовать этот алгоритм, как указано в ее documentation. Алгоритм также работает не только по множеству, но и по любой паре итераторов по отсортированным наборам.

Как уже упоминалось, это внешний алгоритм, а не метод. Предположительно, это нормально для вашего приложения.

+1

Его также можно использовать на _любой_ пару отсортированных контейнеров. – 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

4

Не является «оператор» в том смысле языка, но есть алгоритм set_difference в стандартной библиотеке:

http://www.cplusplus.com/reference/algorithm/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; 
}