Имеет ли установленная структура данных C++ STL оператор разностных разностей?C++ STL разница в настройках
ответ
Да, в заголовке алгоритмов есть функция set_difference.
редактирует:
FYI, структура набора данных имеет возможность эффективно использовать этот алгоритм, как указано в ее documentation. Алгоритм также работает не только по множеству, но и по любой паре итераторов по отсортированным наборам.
Как уже упоминалось, это внешний алгоритм, а не метод. Предположительно, это нормально для вашего приложения.
не как метод, но есть внешняя функция алгоритм set_difference
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
По-видимому, это делает.
Не является «оператор» в том смысле языка, но есть алгоритм set_difference в стандартной библиотеке:
http://www.cplusplus.com/reference/algorithm/set_difference.html
Конечно, другие основные набор операций присутствуют слишком - (союз и т. д.), как это предлагается в разделе «См. также» в конце связанной статьи.
Да, есть, находится в <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
.
+1. К сожалению, когда мне это было нужно, я сдался и катил свой цикл :( – peterchen 2008-11-12 14:52:22
Кстати, если вы используете set_difference в неассоциативном классе контейнера, скажем, вектор, убедитесь, что элементы в обоих контейнерах отсортированы сначала ... ? – paxos1977 2008-11-13 01:06:12
Выбранный ответ правильный, но имеет некоторые синтаксические ошибки.
Вместо
#include <algorithms>
использование
#include <algorithm>
Вместо
std::insert_iterator(result, result.end()));
использование
std::insert_iterator<set<int> >(result, result.end()));
мы можем просто использовать
set_difference(set1.begin(), set1.end(), set2.begin(). set2,end(),std::back_inserter(result)).
Еще раз увеличить на помощь:
#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.
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;
}
Его также можно использовать на _любой_ пару отсортированных контейнеров. – xtofl 2008-11-12 14:16:15
Хороший вопрос ... Я добавил примечание в редакциях. – 2008-11-12 14:43:32