3

我正在尝试浏览列表。以下是一些声明:

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);
}

是否有任何常见原因导致这可能导致段错误?

4

2 回答 2

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;
}

因为擦除返回一个位于下一个元素的迭代器。

(注意:将迭代器作为成员看起来很奇怪。)

于 2011-04-03T09:57:19.783 回答
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());
于 2011-04-03T10:57:52.840 回答