我正在尝试浏览列表。以下是一些声明:
list<CG1_Edge*> ActiveEdges;
list<CG1_Edge*>::iterator ActiveEdgeIterator;
有时,此代码段错误在第2行:
for (this->ActiveEdgeIterator = this->ActiveEdges.begin(); this->ActiveEdgeIterator != this->ActiveEdges.end(); ++this->ActiveEdgeIterator) {
CG1_Edge* currentEdge = *this->ActiveEdgeIterator;
if (currentEdge->y_up < y)
this->ActiveEdges.erase(this->ActiveEdgeIterator);
}
是否有任何常见原因可能导致段错误?
答案 0 :(得分:5)
你应该使用类似的东西:
for (this->ActiveEdgeIterator = this->ActiveEdges.begin(); this->ActiveEdgeIterator != this->ActiveEdges.end(); ) {
CG1_Edge* currentEdge = *this->ActiveEdgeIterator;
if (currentEdge->y_up < y)
this->ActiveEdgeIterator = this->ActiveEdges.erase(this->ActiveEdgeIterator);
else
++this->ActiveEdgeIterator;
}
因为erase返回位于下一个元素的迭代器。
(注意:将迭代器作为成员看起来很奇怪。)
答案 1 :(得分:0)
Begemoth的评论应该是公认的答案。 根据标准擦除使“所有迭代器和位置后元素的引用”无效(我的错误;这是用于矢量和可能的其他容器;所以至少为了避免意外,你应该做得好使用算法版本)。
所以你已经使用rbegin()和rend()更安全了。但为什么不使用std :: alogirthms!
struct Predicate
{
int _y;
explicit Predicate(int y) : _y(y) {}
bool operator()(const CG1_Edge edge) const
{
return currentEdge->y_up < _y;
}
};
std::erase(
std::remove_if(this->ActiveEdges.begin(), this->ActiveEdges.end(), Predicate(y)),
this->ActiveEdges.end());