vector :: erase(remove(....))无法正常工作

时间:2015-07-02 10:29:12

标签: c++ vector erase

我想出了一个程序

#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

这里发生了什么?

2 个答案:

答案 0 :(得分:31)

std::remove通过引用获取第三个参数,它使对它所处理的范围的引用无效(从某种意义上说,它会改变周围的东西,从而改变范围内元素的值)。问题是您在调用期间更改了a[0],即参考参数,您不能这样做。

要解决此问题,请改为传递副本:

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

答案 1 :(得分:1)

或者,改变

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