2012-01-30 265 views
1

从Java和使用ArrayList类的尝试学习C++等价物(Vectors)时,我都感到沮丧。从元素中删除元素而不删除元素后

我正在写一个函数,删除一个int整数的整数。有一段时间我无法弄清楚它为什么会导致分段错误。看完文档后,我意识到.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; 
     } 
    } 
} 
+0

从你的例子中假设你只希望发生一次'n',那么你可能要考虑使用std :: set而不是vector。在这种情况下,您只需要一条语句即可从集合中移除元素 - 'set.erase(n);'。当然,如果你有多个事件,那么你需要一个列表或向量。 – 2012-01-30 20:34:40

回答

3

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

如果通过a更换(n-1),它应该工作:

 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); 
} 
+0

你是对的!需要使用一个而不是n!愚蠢的错误!谢谢! – DomX23 2012-01-30 17:30:11

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 
+0

这将删除具有给定值的所有元素,而不仅仅是第一个元素。首先删除C++惯用的解决方案是使用'std :: find'来获取要删除的元素的迭代器,然后将其删除(首先验证是否存在这样的元素--- v。擦除(v.end())'是未定义的行为)。 – 2012-01-30 17:40:11