Как отмечено в комментариях, у вас есть неопределенное поведение в вашем фрагменте дважды.Сначала вы сравниваете два итератора, которые не ссылаются на один и тот же контейнер.Во-вторых, итератор vc
и переменная цикла i
становятся недействительными при вызове vc.erase(i)
.
Исправление этого является хорошим примером для использования заголовка <algorithm>
и распространенных идиом, когда такие вещи реализуются с помощьюРука склонна к ошибкам.То, что вам нужно, это так называемый erase-remove-idiom :
#include <algorithm>
auto isInV2 = [&v2](const auto& element){
return std::find(v2.cbegin(), v2.cend(), element) != v2.cend(); };
vc.erase(std::remove_if(vc.begin(), vc.end(), isInV2), vc.end());
В зависимости от обстоятельств вашего приложения может также подойти сортировка векторов (или их сортировка)в какой-то момент), а затем используйте бинарный поиск, чтобы проверить наличие элемента, который лучше масштабируется с большими последовательностями.
auto isInV2LogN = [&v2](const auto& element){
return std::binary_search(v2.cbegin(), v2.cend(), element); };
// Important: v2 must be sorted, otherwise std::binary_search doesn't work:
std::sort(v2.begin(), v2.end());
vc.erase(std::remove_if(vc.begin(), vc.end(), isInV2LogN), vc.end());