关于std::list的基本问题

Basic questions about std::list

本文关键字:问题 list std 关于      更新时间:2023-10-16

我想使用list来保存一系列对象,这些对象保存有关我将执行的任务的信息。一旦其中一件物品完成,我就不再需要它了;我只需要转到列表中的下一个对象。它基本上是一个队列。

关于这些对象的指针:

一旦我得到一个指向列表对象的指针来操作,如果我删除列表中的其他元素,这个指针仍然有效,对吗?因为一旦我完成了我的第一个物体,我就会移动到下一个,我将pop第一个物体,同时我继续处理下一个物体,现在它变成了第一个物体。本质上我总是在处理列表中的第一个对象。我想确保,即使我删除了其他列表项,指向现有列表项的指针也不会失效。

(顺便说一下,这是我想使用list的主要原因,所以我可以操作它,而不需要将所有其他列表对象潜在地移动到内存中的新空间,就像vector的情况一样,这会使这变得昂贵)

关于记忆:

当我向列表中添加内容时,我是否可以期望列表具有所有权,并且如果我的原始项超出了范围,而列表仍然在成员变量范围内,我的对象仍然会持续存在?然后,一旦它被弹出,item对象最终会超出作用域?

一旦我得到一个指向列表对象的指针来操作,如果我删除列表中的其他元素,这个指针仍然有效,对吗?

是的,因为指向std::list的指针不是指向普通双链表的头元素的指针——std::list类有内部指针,它使它们远离用户(你可以使用迭代器迭代列表,但不能使用普通指针)。

当我向列表中添加内容时,我是否可以期望列表具有所有权,并且如果我的原始项超出了范围,而列表仍然在成员变量范围内,我的对象仍然会持续存在?然后,一旦它被弹出,item对象最终会超出作用域?

您需要创建std::list<T>而不是std::list<T*>。这样,当您向列表中添加元素时,将调用复制构造函数,并将对象的副本放置在列表中,而不是实际对象。

如果我删除列表中的其他元素,这个指针仍然有效,对吗?

是的,列表元素的迭代器仍然有效,除非你显式地从列表中删除元素或清除列表。

当我向列表中添加内容时,我是否可以期望列表具有所有权,并且如果我的原始项超出了范围,而列表仍然在成员变量范围内,我的对象仍然会持续存在?

是的,有点。列表复制您放入其中的元素。它并没有真正的占有的所有权,而是创建了一个它拥有的新对象。

然后,一旦弹出,item对象最终将超出作用域?

是,该对象将不复存在。

请注意,如果将指针传递给对象,则所有的赌注都无效。在这种情况下,列表只控制它所持有的指针的生命周期,而不控制这些指针指向的对象的生命周期。