gpt4 book ai didi

c++ - C++-std::list.erase()不删除元素

转载 作者:行者123 更新时间:2023-12-02 09:51:31 26 4
gpt4 key购买 nike

我在为学校分配一些代码时遇到了一个小问题(我知道这里已经避免了,但是我锁定自己使用std::list库并为此付费)。我有一个函数,该函数具有指向传递给它的类的指针的列表以及属于我要销毁并调整列表大小的那些类之一的特定ID。但是,使用我的代码,列表永远不会调整大小,并且值是垃圾,这会使我的程序崩溃。所以看起来实际的类正在被删除,但是元素从未从列表中删除...
如果我有时间进行自己的双向链接列表实现,则可以遍历列表以查找要删除的元素。如果找到它,请创建一个临时节点指针并将其指向我要删除的节点。将上一个节点的“next”元素设置为迭代器的“next”元素,然后删除该迭代器节点。
但是..使用stl::list实现,我无所适从。这是到目前为止我所拥有的,其中DOCO是一个类,列表中的元素是指向类实例的指针。我研究了remove()erase(),也许两者都可以解决这个问题,但是我不确定如何用这样的迭代器实现remove()

bool DOCO::kill_doco(std::list < DOCO* > docolist, int docoid)
{
for (std::list<DOCO*>::iterator it = docolist.begin(); it != docolist.end(); )
{
if ((*it)->id == docoid)
{
delete * it;
it = docolist.erase(it);
std::cerr << "item erased\n";
}
else
{
++it;
}
}
std::cerr << "leaving kill\n";

return true;
}

最佳答案

kill_doco(std::list < DOCO* > docolist
这将创建列表的 副本。该副本是一个指针列表。
您可以继续修改列表的副本,并删除其中的元素。
原始列表(您复制的列表)仍然具有原始指针,该指针现在指向已删除的对象。
简单的解决方法是:
kill_doco(std::list < DOCO* >& docolist
C++是一种面向值(value)的语言,与Java或C#等语言不同。事物的名称指的是该事物的实际值,而不是对其的引用。
指针类似地是对象地址的值。
引用(如语义)或指针(如指针)语义可以在C++中完成。但是,与Java / C#不同,默认情况下,C++中的每个对象都是实际值。
从一种语言切换到另一种语言(两种方式)的人会为此感到困惑。
C++程序中的“默认”对象类型是常规类型,即在将其复制等时的行为类似于整数。远离它相对容易,但这是默认设置。
因此,您所做的类似于:
void clear_bit( int x, int bit ) {
x = x & ~(1 << bit);
}
感到惊讶的是,您传入的 x值未被该函数修改。原始列表中剩下的“悬空”指针是您遇到的第二件事。

关于c++ - C++-std::list.erase()不删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64298264/

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