c++ - 迭代器在第 8 个元素 PLF::Colony 上不引用任何内容

标签 c++ c++11 iterator containers

我有一个有趣的问题。对于初学者,我目前正在开发一个 2D 几何编辑器,用户可以在其中绘制直线和圆弧。为了绘制直线和圆弧,用户需要选择 2 个节点。

在论坛上的一个较早的问题中,我想知道是否有任何可用的东西不会在元素被删除(或插入)但不是 std::list 时使指针无效(由于各种原因散布在整个堆栈溢出中).一位用户建议我看一下 plf::colony类(class)。简而言之,它的行为类似于 std::list,但在许多情况下具有 std::deque 的速度。

无论如何,我正在我的程序中实现这个类来包含节点、线和弧。我能够成功地整合类(class)并构建所有内容。但是,我在去删除节点的时候注意到我的bug中有一个bug。

我已将问题缩小为:如果我创建的节点少于 10 个,我的代码可以毫无问题地删除所有节点。但是,如果我选择所有 10 个节点,我的程序就会崩溃。如果我绘制 20 个节点并选择其中 10 个进行删除,我的程序就会崩溃。如果我绘制 15 个节点并选择其中的 5 个,一切都很好。如果我绘制 15 个节点并选择其中的 7 个,一切都很好。如果我绘制 15 个节点并选择 8,程序就会崩溃。如果我绘制 50 个节点并选择 8 个进行删除,程序会崩溃。第 8 个节点似乎使程序崩溃。

后来,我单步执行了代码(我已在下面发布),一切正常,直到迭代器到达第 8 项。在那里,迭代器没有指向任何东西并使程序崩溃。程序在尝试从集群中删除迭代器时崩溃。

我想知道使用 plf::colony 的其他人是否遇到了同样的问题,他们做了什么来修复这个错误?还是我设置代码的方式有问题?

    for(int i = 1; i < 21; i++)
{
    _editor.addNode(0.25 * i, 0);
    _editor.getNodeList()->back()->setSelectState(true);
}


if(_editor.getNodeList()->size() > 0)
{
    plf::colony<node>::iterator stopIterator = _editor.getNodeList()->end();
    for(plf::colony<node>::iterator nodeIterator = _editor.getNodeList()->begin(); nodeIterator != _editor.getNodeList()->end(); ++nodeIterator)
    {
        if(nodeIterator->getIsSelectedState())
        {

            if(_editor.getNodeList()->size() <= 1 && _editor.getNodeList()->begin()->getIsSelectedState())
            {
                if(_editor.getNodeList()->size() == 1)
                    _editor.getNodeList()->clear();
                break; 
            }

           _editor.getNodeList()->erase(nodeIterator);
        }
    }
}

编辑:

好的,所以这个来自代码的修复无法使程序崩溃:

plf::colony<node>::iterator stopIterator = _editor.getNodeList()->end();
    for(plf::colony<node>::iterator nodeIterator = _editor.getNodeList()->begin(); nodeIterator != _editor.getNodeList()->end();)
    {
        if(nodeIterator->getIsSelectedState())
        {
            if(_editor.getLineList()->size() > 1)
            {
                /* Need to cycle through the entire line list and arc list in order to determine which arc/line the node is associated with and delete that arc/line by selecting i.
                 * The deletion of the arc/line occurs later in the code*/

                for(plf::colony<edgeLineShape>::iterator lineIterator = _editor.getLineList()->begin(); lineIterator != _editor.getLineList()->end(); ++lineIterator)
                {
                    if(*lineIterator->getFirstNode() == *nodeIterator || *lineIterator->getSecondNode() == *nodeIterator)
                    {
                        lineIterator->setSelectState(true);
                    }
                }
            }


            if(_editor.getArcList()->size() > 0)
            {
                for(plf::colony<arcShape>::iterator arcIterator = _editor.getArcList()->begin(); arcIterator != _editor.getArcList()->end(); ++arcIterator)
                {
                    if(*arcIterator->getFirstNode() == *nodeIterator || *arcIterator->getSecondNode() == *nodeIterator)
                    {
                        arcIterator->setSelectState(true);
                    }
                }
            }
           _editor.getNodeList()->erase(nodeIterator++);     
        }
        else
            nodeIterator++;
    }

最佳答案

我不熟悉 plf::colony,但文档指出元素不会因删除而失效,已删除的元素除外。你删除你的 nodeIterator 然后你 ++nodeIterator 它。

我的建议是尝试重写您的循环,以便您可以使用 nodeIterator++ 调用删除函数。

关于c++ - 迭代器在第 8 个元素 PLF::Colony 上不引用任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43123349/

相关文章:

Java ArrayList Iterator next() 没有按预期工作

c++ - OS X Yosemite 中的 gcc 4.9.1 - gcc : warning: couldn’t understand kern. osversion ‘14.0.0'

c++ - 一段 qcustomplot 代码不起作用(小示例代码)

c++ - 使用 c++ typedef/使用类型别名

c++ - 为什么一个表达式是常量,而另一个不是?

c++ - 检查给定索引是否存在于 std::vector 中

c++ - 在一个类中引用另一个类

c++ - 当我们尝试使用和不使用虚函数访问向下转换的指针时发生了什么

c++ - 模板并不总是猜测初始化列表类型

STL 容器上的 C++ 模板函数