我想使用erase方法从向量中清除一个元素。但这里的问题是,不能保证元素在向量中只出现一次。它可能会出现多次,我需要清除所有它们。我的代码是这样的:
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;
}
这段代码显然会崩溃,因为我在迭代时更改了向量的末尾。实现这一目标的最佳方法是什么?也就是说,有没有办法在不多次迭代向量或创建一个向量副本的情况下做到这一点?
发布于 2008-12-07 11:07:11
std::vector<int>& vec = myNumbers; // use shorter name
vec.erase(std::remove(vec.begin(), vec.end(), number_in), vec.end());
发生的情况是,remove
压缩与vector
开头要删除的值(number_in
)不同的元素,并将迭代器返回到该范围之后的第一个元素。然后erase
删除这些元素(其值未指定)。
发布于 2008-12-07 11:18:49
根据您这样做的原因,使用std::set可能比std::vector更好。
它允许每个元素只出现一次。如果多次添加,则无论如何都只有一个实例要擦除。这将使擦除操作变得微不足道。擦除操作的时间复杂度也比向量低,但是,在集合上添加元素的速度较慢,因此它可能没有太大优势。
当然,如果你对一个元素被添加到向量中的次数或者元素的添加顺序感兴趣,那么这个方法就不会起作用。
https://stackoverflow.com/questions/347441
复制相似问题