繁体   English   中英

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

[英]C++ - std::list.erase() not removing element

我在学校作业的一些代码方面遇到了一个小问题(我知道这里避开了这一点,但我将自己锁定在使用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++ 是一种面向价值的语言,与 Java 或 C# 等语言不同。 事物的名称指的是该事物的实际价值,而不是对它的引用。

指针同样是对象地址的值。

类似引用的语义,或类似指针的语义,可以在 C++ 中完成。 但是,与 Java/C# 不同的是,默认情况下,C++ 中的每个对象都是一个实际值。

从一种语言迁移到另一种语言(无论哪种方式)的人可能会对此感到困惑。

C++ 程序中的“默认”对象类型是常规类型——当你复制它时,这种类型就像整数一样。 摆脱这一点相对容易,但这是默认设置。

所以你所做的类似于:

void clear_bit( int x, int bit ) {
  x = x & ~(1 << bit);
}

并惊讶于您传入的值x没有被函数修改。 原始列表中留下的“悬空”指针是咬你的第二件事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM