关于std :: list的基本问题

时间:2013-04-26 10:30:34

标签: c++ list containers

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

关于指向这些对象的指针:

一旦我得到一个指向列表对象的指针,如果我删除列表中的其他元素,这个指针仍然有效,对吧?因为一旦我完成了我的第一个对象,我将移动到下一个对象,当我继续使用下一个对象时,我将pop第一个对象,现在成为第一个对象。基本上我将一直在处理列表中的第一个对象。我想确保即使删除其他列表项也不会使指向现有列表项的指针失效。

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

关于记忆:

当我在列表中添加内容时,我是否可以期望列表获取所有权?如果我的原始项目超出范围而列表仍在成员变量范围内,我的对象仍然会持续存在?然后,一旦弹出,项目对象最终会超出范围?

2 个答案:

答案 0 :(得分:2)

  

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

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

  

当我在列表中添加内容时,我是否可以期望列表获取所有权?如果我的原始项目超出范围而列表仍在成员变量范围内,我的对象仍然会持续存在?然后,一旦弹出,项目对象最终会超出范围?

您需要创建std::list<T>而不是std::list<T*>。这样,当您向列表中添加元素时,将调用copy-constructor,并且该对象的副本将放在列表中,而不是实际对象。

答案 1 :(得分:0)

  

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

是的,除非您从列表中明确删除元素或清除列表,否则列出元素的迭代器仍然有效。

  

当我向列表添加内容时,我是否可以期望列表获取所有权?如果我的原始项目超出范围而列表仍在成员变量范围内,我的对象仍将保留?

是的,有点儿。该列表会复制您推入的元素。它并不真正接受所有权,而是创建一个新的对象,它拥有。

  

然后,一旦弹出,项目对象最终会超出范围?

是的,该物体将不复存在。

请注意,如果您将指针传递给对象,则所有投注均已关闭。在这种情况下,列表仅控制它所持有的指针的生命周期,而不是它们指向的对象。