关于std::list的基本问题
Basic questions about std::list
我想使用list
来保存一系列对象,这些对象保存有关我将执行的任务的信息。一旦其中一件物品完成,我就不再需要它了;我只需要转到列表中的下一个对象。它基本上是一个队列。
关于这些对象的指针:
一旦我得到一个指向列表对象的指针来操作,如果我删除列表中的其他元素,这个指针仍然有效,对吗?因为一旦我完成了我的第一个物体,我就会移动到下一个,我将pop
第一个物体,同时我继续处理下一个物体,现在它变成了第一个物体。本质上我总是在处理列表中的第一个对象。我想确保,即使我删除了其他列表项,指向现有列表项的指针也不会失效。
(顺便说一下,这是我想使用list
的主要原因,所以我可以操作它,而不需要将所有其他列表对象潜在地移动到内存中的新空间,就像vector
的情况一样,这会使这变得昂贵)
当我向列表中添加内容时,我是否可以期望列表具有所有权,并且如果我的原始项超出了范围,而列表仍然在成员变量范围内,我的对象仍然会持续存在?然后,一旦它被弹出,item对象最终会超出作用域?
一旦我得到一个指向列表对象的指针来操作,如果我删除列表中的其他元素,这个指针仍然有效,对吗?
是的,因为指向std::list
的指针不是指向普通双链表的头元素的指针——std::list
类有内部指针,它使它们远离用户(你可以使用迭代器迭代列表,但不能使用普通指针)。
当我向列表中添加内容时,我是否可以期望列表具有所有权,并且如果我的原始项超出了范围,而列表仍然在成员变量范围内,我的对象仍然会持续存在?然后,一旦它被弹出,item对象最终会超出作用域?
您需要创建std::list<T>
而不是std::list<T*>
。这样,当您向列表中添加元素时,将调用复制构造函数,并将对象的副本放置在列表中,而不是实际对象。
如果我删除列表中的其他元素,这个指针仍然有效,对吗?
是的,列表元素的迭代器仍然有效,除非你显式地从列表中删除元素或清除列表。
当我向列表中添加内容时,我是否可以期望列表具有所有权,并且如果我的原始项超出了范围,而列表仍然在成员变量范围内,我的对象仍然会持续存在?
是的,有点。列表复制您放入其中的元素。它并没有真正的占有的所有权,而是创建了一个它拥有的新对象。
然后,一旦弹出,item对象最终将超出作用域?
是,该对象将不复存在。
请注意,如果将指针传递给对象,则所有的赌注都无效。在这种情况下,列表只控制它所持有的指针的生命周期,而不控制这些指针指向的对象的生命周期。
- 警告处理为错误这里有什么问题
- 使用std::multimap迭代器创建std::list
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板类和继承问题 - 'List'不命名非静态数据成员或基类
- c++中List和Map之间的性能问题
- 关于std::list的基本问题
- 抽象类和虚方法问题:不能将变量' list '声明为抽象类型' aStack
' aStack - iPhone-Cocos2d-Box2d游戏 #include <list> 问题