C++ 关于std::list的基本问题

C++ 关于std::list的基本问题,c++,list,containers,C++,List,Containers,我想使用列表来保存一系列对象,这些对象保存有关我将执行的任务的信息。一旦其中一件物品完成,我就不再需要它了;我只需要转到列表中的下一个对象。这基本上是一个队列 关于指向这些对象的指针: 一旦我得到一个指向列表对象的指针,如果我删除列表中的其他元素,这个指针仍然有效,对吗?因为一旦我完成第一个对象,我将移动到下一个对象,我将pop第一个对象,同时我继续处理下一个对象,它现在成为第一个对象。基本上,我将始终处理列表中的第一个对象。我想确保指向现有列表项的指针不会失效,即使我删除了其他列表项 (顺便说

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

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

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

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

关于内存:

当我向列表中添加一些内容时,我是否可以期望列表拥有所有权?如果我的原始项超出范围,而列表仍在成员变量范围内,那么我的对象仍将保持不变?然后,一旦它被弹出,item对象最终将超出范围

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

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

当我向列表中添加一些内容时,我是否可以期望列表拥有所有权?如果我的原始项超出范围,而列表仍在成员变量范围内,那么我的对象仍将保持不变?然后,一旦它被弹出,item对象最终将超出范围

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

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

是的,列出元素的迭代器保持有效,除非您从列表中明确删除元素或清除列表

当我向列表中添加一些内容时,我是否可以期望列表拥有所有权?如果我的原始项超出范围,而列表仍在成员变量范围内,那么我的对象仍将保持不变

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

然后,一旦它被弹出,item对象最终将超出范围

是的,对象将不再存在


请注意,如果将指针传递给对象,则所有下注都将关闭。在这种情况下,列表仅控制其所持有指针的生存期,而不是这些指针指向的对象。

如果要将其用作队列,那么为什么不使用?@JoachimPileborg我的阅读资料表明,如果在迭代过程中对列表进行操作,
list
是最好的选择。如果我在
for
循环中使用
迭代器
,并且在当前的
迭代器
迭代中使用
擦除
for
循环应继续正常运行,并访问
列表
元素的其余部分?@SebbyJohanns问题是当您执行
for(iter=…;iter!=end;++iter)列表时。擦除(iter),擦除将使iter失效,因此以下增量在技术上无效。你可以做的是
for(iter=…;iter!=end;iter=list.erase(iter))
或者
for(iter=…;iter!=end;)if(to_erase)iter=list.erase(iter);else++iter根据您的特殊需要(部分擦除与全部擦除,尽管对于整个擦除
list.clear()
将更容易)。@ChristianRau非常好,先生您是一位学者和绅士,我很感激!!