all
- вектор векторов. it1
- это итератор для all
, поэтому его можно передать в all.erase
. it1
относится к одному из векторов внутри all
.
it2
не является итератором для all
, поэтому его нельзя передать в all.erase
. it2
является итератором для вектора *it1
, который является вектором Animals
. it2
можно передать на it1->erase
. it2
относится к одному из Animals
в *it1
.
Однако обратите внимание, что удаление итератора для вектора делает его недействительным. it1
и it2
по-прежнему используются в цикле так, что это нельзя делать на недопустимом итераторе. Таким образом, использование erase
в цикле без исправления итератора ведет к неопределенному поведению.
Идиоматическим способом выборочного удаления некоторых элементов контейнера является удаление-удаление:
auto predicate = [&ans](const Animals& a) {
return a.getter_name()==ans;
};
for(std::vector<Animals>& v : all) {
v.erase(std::remove_if(v.begin(), v.end(), predicate));
}
Это удаляет всеAnimals
, которые соответствуют предикату в каждом из векторов в all
.