2015-07-02 125 views
24

我想出了一個計劃矢量::擦除(刪除(....))不工作

#include <vector> 
#include <algorithm> 

using namespace std; 

int main() { 
    vector<int> a = {1,2,3,7,1,5,4}; 
    vector<int> b = {6,7,4,3,3,1,7}; 
    a.erase(remove(a.begin(),a.end(),a[0]),a.end()); 
    b.erase(remove(b.begin(),b.end(),b[0]),b.end()); 

    return 1; 
} 

對於這個具體的例子,我的GNU GDB的Ubuntu指出,在return 1行:a = {2,3,7,1,5,4}這是不是預期的(僅刪除一個1)和b = {7,4,3,3,1},這不是預期的。

我的期望是ab應該是a=2,3,7,5,4b=7,4,3,3,1,7

這是怎麼回事?

回答

31

std::remove通過引用獲取第三個參數,它將引用到它所處理的範圍內(從某種意義上說,它將東西移動並因此更改範圍中元素的值)。問題在於你在呼叫期間更改了參考參數a[0],你不能這樣做。

爲了解決這個問題,通過一個副本,而不是:

a.erase(remove(a.begin(),a.end(),int{a[0]}),a.end()); 
1

備選地,更改

a.erase(remove(a.begin(), a.end(), 1), a.end()); 
b.erase(remove(b.begin(), b.end(), 6), b.end());