STL容器和不可复制(和不可移动)的对象
STL containers and non copyable (and non movable) objects
既然STL容器要求所有内容都是可复制和可分配的,那么在处理不可复制对象时,首选的习惯做法是什么?
我能想到两种不同的方法:
-
在STL容器中存储(智能)指针而不是对象。
-
摆脱STL容器并实现我自己的列表(例如,每个对象必须包含指向下一个对象的指针)。
第二种方法的主要缺点是析构函数的实现("下一个"对象应该在当前对象之前以递归的方式被销毁吗?)
既然STL容器要求所有内容都是可复制和可分配的,那么在处理不可复制对象时,首选的习惯用法是什么?
实际上,c++ 11要求对象是可移动的。多亏了emplace_*
方法,只有某些操作需要它们是可赋值的。
我能想到两种不同的方法:
在STL容器中存储(智能)指针而不是对象。
摆脱STL容器并实现我自己的列表(例如,每个对象必须包含指向下一个对象的指针)。
这两种方法肯定是可行的。
在c++ 11中,带有std::unique_ptr<YourObject>
元素的STL容器可能是最好的选择。一直都是标准的。基于节点的容器可能有一个轻微的性能问题,因为节点和它们指向的元素将是不同的内存区域;但通常是难以察觉的。
如果它是可察觉的,或者如果你不能使用c++ 11,那么你应该学习侵入性容器,它包括用钩子增加你的对象,这样他们就可以把自己安排到列表中,例如。有一个Boost库可以解决这个问题,很明显:Boost. invasive .
不可移动你说?
老实说,我要挑战大多数认为物体不应该移动的设计。移动的唯一问题与对象标识有关,以及指向被移动对象的指针失效的潜在问题(从而导致后面的悬浮指针失效)。这通常可以通过智能指针和/或工厂方法解决。
我会选择方法#1:即在STL容器中存储智能指针。
请注意,在STL容器中存储非拥有的原始指针是可以的(例如观察原始指针),但是存储拥有的原始指针是一个"泄漏":使用 shared_ptr
或新的c++ 11的 unique_ptr
。
至于第2点,从头编写自己的容器需要大量的时间和精力,而且我相信您无法在合理的时间范围内匹敌完整的商业质量的STL库实现的丰富性。
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么协程的返回类型必须是可移动构造的?
- 我应该使我的局部变量常量还是可移动的
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 如何获取类型是否真正可移动可构造
- 可移动但不可复制的对象:按值传递还是按引用传递?
- 对于可移动类型,按值传递比重载函数更好吗?
- 使用参数将仅可移动对象捕获到 lambda
- 从从可调用参数创建的线程对象参数移动构造 C++11 线程
- C++11/VS2010:返回包含不可复制但可移动对象的容器
- 传递可移动对象
- 无法将可移动对象与Boost.Asio一起使用
- 如何按值返回一个不可复制的、可移动的对象作为const并存储它
- 在std::函数中存储不可复制但可移动的对象
- 在std::pair中存储不可复制(但可移动)的对象
- Boost序列化不可复制但可移动的对象
- 包含boost::可选对象的std::矢量对象是否可以移动?可移动助推::可选
- 编译器是否在最后一次使用可移动对象时自动使用移动语义?
- 外部模板类std::可移动对象的容器
- 作用于可移动但不可复制对象序列的变化STL算法的行为