Алгоритмы stl предоставляют несколько функций для выполнения операций над множествами, в частности вычисление симметричной разности множества , что вам и нужно.
Вот пример использования:
#include <algorithm>
#include <vector>
int main(int argc, char **argv) {
std::vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
v1.push_back(6);
std::vector<int> v2;
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
v2.push_back(8);
// Ranges must be sorted!
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
std::vector<int> res; // Will contain the symmetric difference
std::set_symmetric_difference(v1.begin(), v1.end(),
v2.begin(), v2.end(),
std::back_inserter(res));
// Copy result to the output
std::copy(res.begin(), res.end(), std::ostream_iterator<int>(cout, " "));
// Prints "1 3 5"
return 0;
}
std::set_symmetric_difference
принимает два диапазона (то есть две пары OutputIterator) и InputIterator, в который он помещает результат. Он также возвращает итератор в конец диапазона результатов.
EDIT
Я только что прочитал ваши комментарии на ваш вопрос. Если вы хотите изменить два исходных вектора, вы можете использовать std::set_difference
:
vector<int>::iterator endRange;
endRange = set_difference(v1.begin(), v1.end(),
v2.begin(), v2.end(),
v1.begin());
v1.erase(endRange, v1.end());
Здесь мы помещаем результат разности множеств v1 - v2 в v1. Однако, мы не можем сделать наоборот, так как v1 теперь изменен. Решение состоит в том, чтобы вычислить пересечение v1 и v2, а затем разность с этим пересечением:
vector<int> inter;
set_intersection(v1.begin(), v1.end(),
v2.begin(), v2.end(),
back_inserter(inter));
// inter is "2 4 6"
v1.erase(set_difference(v1.begin(), v1.end(),
inter.begin(), inter.end(),
v1.begin())
v1.end());
// v1 is "1 3 5"
v2.erase(set_difference(v2.begin(), v2.end(),
inter.begin(), inter.end(),
v2.begin())
v2.end());
// v2 is "8"
Я думаю, что есть гораздо более эффективные решения, но это ясно, и действительно передать ваши намерения с помощью широко известных алгоритмов stl.