我想用矢量清除方法清除矢量中的元素。但这里的问题是元素不能保证只在向量中出现一次。它可能会出现多次,我需要清除所有这些。我的代码是这样的:从矢量中清除元素
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)算法存在。你可以做得更好。另外,根据STL向量<>的实现,可以删除(iter),然后再加上++ iter,可以跳过以下条目。考虑“擦除v [i = 2]; i ++;” - 你永远不会检查v []中的原始i = 3(现在是i = 2)条目。 – 2008-12-08 04:40:25