Вот пример того, как вы можете применить идиому erase-remove для трех векторов одновременно.
Алгоритм в O ( N ), т.е. требуетодин проход по векторам.
template<typename T1, typename T2, typename T3, typename P>
void erase3(T1& v1, T2& v2, T3& v3, P predicate) {
auto first1 = begin(v1);
auto first2 = begin(v2);
auto first3 = begin(v3);
while (first1 != end(v1) && !predicate(*first1)) {
++first1; ++first2; ++first3;
}
if (first1 != end(v1)) {
auto it1 = first1; auto it2 = first2; auto it3 = first3;
while (++it1 != end(v1)) {
++it2;
++it3;
if (!predicate(*it1)) {
*first1++ = std::move(*it1);
*first2++ = std::move(*it2);
*first3++ = std::move(*it3);
}
}
v1.erase(first1, end(v1));
v2.erase(first2, end(v2));
v3.erase(first3, end(v3));
}
}
int main()
{
std::vector<int> v1 = { 1,2,3,4,5 }, v2 = { 11,12,13,14,15 }, v3 = { 21,22,23,24,25 };
erase3(v1, v2, v3, [](int a) { return a == 3 || a == 4; });
}
Это работает, перемещая все оставшиеся элементы в начало векторов, а затем обрезая выдвинутые элементы с конца.