Я хочу очистить элемент от вектора, используя метод стирания. Но проблема здесь в том, что элемент не гарантированно встречается только один раз в векторе. Он может присутствовать несколько раз, и мне нужно очистить все из них. Мой код-то вроде этого:Стирание элементов из вектора
void erase(std::vector<int>& myNumbers_in, int number_in)
{
std::vector<int>::iterator iter = myNumbers_in.begin();
std::vector<int>::iterator endIter = myNumbers_in.end();
for(; iter != endIter; ++iter)
{
if(*iter == number_in)
{
myNumbers_in.erase(iter);
}
}
}
int main(int argc, char* argv[])
{
std::vector<int> myNmbers;
for(int i = 0; i < 2; ++i)
{
myNmbers.push_back(i);
myNmbers.push_back(i);
}
erase(myNmbers, 1);
return 0;
}
Этот код явно выходит из строя, потому что я меняюсь конец вектора во время прохода через него. Каков наилучший способ достичь этого? То есть есть ли способ сделать это без повторения через вектор несколько раз или создания еще одной копии вектора?
Я попытался выше фрагмент кода. Он работал для моего первоначального случая, но когда я создал вектор с 0,0,0,1 в качестве значений и попытался стереть 0, он не работал должным образом. После выхода из цикла я обнаружил, что размер вектора равен 2 вместо 1. – Naveen 2008-12-07 10:29:57
Это наихудший случай O (N^2). O (N). Ты можешь лучше. Кроме того, erase (iter), за которым следует ++ iter, может, в зависимости от реализации STL vector <>, пропустить следующую запись. Рассмотрим «erase v [i = 2]; i ++;» - вы никогда не проверяете исходную запись i = 3 (теперь i = 2) в v []. – 2008-12-08 04:40:25