2012-01-30 314 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