使用 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());
当我执行下面包含 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());