从向量中删除一个元素而不删除之后的元素

Posted

技术标签:

【中文标题】从向量中删除一个元素而不删除之后的元素【英文标题】:Removing an element from the vector without removing the elements after 【发布时间】:2012-01-30 17:25:59 【问题描述】:

来自 Java 并使用 ArrayList 类让我在尝试学习 C++ 等价物(向量)时感到非常沮丧。

我正在编写一个从整数向量中删除某个整数的函数。有一段时间我无法弄清楚为什么它会导致分段错误。在查看文档后,我意识到 .erase 也会在删除元素后删除任何元素。这绝对不是我想要做的,所以我有点迷失了如何从向量中只删除一个元素而不删除之后的元素。

我目前拥有的导致分段错误的函数:

void remove(int n)

    for(int a=0; a<list.size(); a++)

        if(list.at(a)==n)
            list.erase (list.begin()+(n-1));
            cout << n << " has been erased" << endl;
            break;
        
    

【问题讨论】:

从您的示例中假设您只期望出现一次“n”,那么您可能需要考虑使用 std::set 而不是向量。在这种情况下,您只需要一条语句即可从集合中删除元素 - 'set.erase(n);'。当然,如果您有多次出现,那么您将需要一个列表或向量。 【参考方案1】:

您正在寻找 n 作为一个元素,但也将它用作索引。我不认为这是你想要的。

如果您将(n-1) 替换为a,它应该可以工作:

        list.erase(list.begin()+a);

删除单个元素的替代方法,使用finderase

#include <algorithm>
//...
void removeOne(int n)
    vector<int>::iterator found = std::find(list.begin(), list.end(), n) ;
    if (found!=list.end())
        list.erase(found);

【讨论】:

你是对的!需要使用 a 而不是 n!愚蠢的错误!谢谢!【参考方案2】:
std::vector<int> v; 
// fill it up somehow
v.erase(std::remove(v.begin(), v.end(), 99), v.end()); 
// really remove all elements with value 99

【讨论】:

这将删除所有具有给定值的元素,而不仅仅是第一个。删除第一个的 C++ 惯用解决方案是使用 std::find 获取要删除的元素的迭代器,然后删除它(首先验证存在这样的元素 ---v.erase( v.end() ) 是未定义的行为)。【参考方案3】:

你需要iterator erase ( iterator first, iterator last );

见here。 (http://www.cplusplus.com/reference/stl/vector/erase/)

【讨论】:

我完全误解了您的需求,请忽略我! ^_^

以上是关于从向量中删除一个元素而不删除之后的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何从向量中随机删除一个元素?

分段错误:从二维向量中随机删除元素

从向量中删除元素时如何减小向量的大小?

从向量结构中删除元素[关闭]

从末尾删除向量中的所有空元素

如何从具有用户类参数的向量中删除元素?