【问题标题】: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);'。当然,如果您有多次出现,那么您将需要一个列表或向量。

标签: c++ vector


【解决方案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/)

【讨论】:

  • 我完全误解了您的需求,请忽略我! ^_^
猜你喜欢
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2014-05-05
  • 2011-04-14
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 2020-05-22
相关资源
最近更新 更多