gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:33:14 25 4
gpt4 key购买 nike

我有一个有趣的问题。对于初学者,我目前正在开发一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com