首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >擦除矢量中的元素

擦除矢量中的元素
EN

Stack Overflow用户
提问于 2008-12-07 18:10:20
回答 2查看 142.8K关注 0票数 112

我想使用erase方法从向量中清除一个元素。但这里的问题是,不能保证元素在向量中只出现一次。它可能会出现多次,我需要清除所有它们。我的代码是这样的:

代码语言:javascript
复制
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;
}

这段代码显然会崩溃,因为我在迭代时更改了向量的末尾。实现这一目标的最佳方法是什么?也就是说,有没有办法在不多次迭代向量或创建一个向量副本的情况下做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-12-07 11:07:11

使用remove/erase idiom

代码语言:javascript
复制
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删除这些元素(其值未指定)。

票数 188
EN

Stack Overflow用户

发布于 2008-12-07 11:18:49

根据您这样做的原因,使用std::set可能比std::vector更好。

它允许每个元素只出现一次。如果多次添加,则无论如何都只有一个实例要擦除。这将使擦除操作变得微不足道。擦除操作的时间复杂度也比向量低,但是,在集合上添加元素的速度较慢,因此它可能没有太大优势。

当然,如果你对一个元素被添加到向量中的次数或者元素的添加顺序感兴趣,那么这个方法就不会起作用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/347441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档