Ваш код нарушает пару инвариантов для set_difference
. Со страницы 420 Книги Йосуттиса :
- Вызывающий должен убедиться, что диапазон назначения достаточно велик или используются итераторы вставки.
- Диапазон назначения не должен перекрывать исходные диапазоны.
Вы пытаетесь перезаписать первый набор, что запрещено. Вам нужно написать что-то другое, кроме исходных диапазонов - для этого мы можем использовать третий набор:
std::set<int> set3;
std::set_difference(set1.begin(), set1.end(),
set2.begin(), set2.end(),
std::inserter(set3, set3.begin()));
Второй аргумент std::inserter
- это подсказка, куда следует вставлять элементы. Это только подсказка, однако, будьте уверены, что элементы окажутся в нужном месте. set3
изначально пуст, поэтому begin()
- это единственный намек, который мы можем дать.
После вызова set_difference
, set3
будет содержать то, что вы пытались сделать set1
в исходном коде. Вы можете продолжать использовать set3
или swap
с set1
, если хотите.
Обновление:
Я не уверен насчет производительности, но если вы просто хотите удалить все элементы из set1
, которые появляются в set2
, вы можете попробовать:
for (std::set<int>::iterator i = set2.begin(); i != set2.end(); ++i)
{
set1.erase(*i);
}