使用 erase–remove 习语时崩溃

Crash when using erase–remove idiom

当我执行下面包含 erase–remove idiom 的代码时,我遇到了崩溃(分段错误)。我想知道是什么问题。

class One
{
public:
    One() {}
    void print(){  std::cout << "print id: " << id << "\n"; }
    void setId(int i) { id =i;}
    int getID(){ return id;}
private:
    int id;
};
 
int main()
{
    std::vector<One*> v;
    std::vector<One*> v2;
 
 
    for (int i = 0; i < 10; ++i) {
        One* one = new One;
        one->setId(i);
        v.push_back(one);
        v2.push_back(one);
    }
 
    v.erase((std::remove(v.begin(), v.end(), v2[2]), v.end()));
 
    return 0;
}

这行代码:

v.erase((std::remove(v.begin(), v.end(), v2[2]), v.end()));

相当于:

v.erase((some_iterator, v.end()));

其中 some_iterator 是调用 std::remove 的 return 值。

现在相当于:

v.erase(v.end());

原因是括号中包含了这个语句:

(some_iterator, v.end())

转换为调用逗号运算符的表达式。逗号运算符采用逗号右侧的值,并将其用作最终值。

更正是去掉多余的括号:

v.erase(std::remove(v.begin(), v.end(), v2[2]), v.end());