STL容器和不可复制(和不可移动)的对象

jbg*_*bgs 5 c++ stl

由于STL容器要求所有内容都是可复制和可分配的,因此在处理不可复制对象时,首选的习惯是什么?

我可以想到两种不同的方法:

  1. 存储(智能)指针而不是STL容器中的对象.

  2. 摆脱STL容器并实现我自己的列表(例如,每个对象必须包含指向下一个对象的指针).

第二种方法的主要缺点是析构函数的实现("下一个"对象应该以递归方式在当前对象之前销毁吗?)

Mat*_* M. 6

由于STL容器要求所有内容都是可复制和可分配的,因此在处理不可复制对象时,首选的习惯是什么?

好吧,实际上使用C++ 11,它们需要对象是Movable.由于emplace_*方法的原因,只有某些操作要求它们是可分配的.

我可以想到两种不同的方法:

  1. 存储(智能)指针而不是STL容器中的对象.

  2. 摆脱STL容器并实现我自己的列表(例如,每个对象必须包含指向下一个对象的指针).

这两种方法当然是可行的.

在C++ 11中,具有std::unique_ptr<YourObject>元素的STL容器可能是最佳选择.它一直是标准的.基于节点的容器可能存在轻微的性能问题,因为节点和它们指向的元素将是不同的内存区域; 但它通常是难以察觉的.

如果它是可察觉的,或者你不能使用C++ 11,那么你应该学习侵入式容器,例如,用钩子扩充你的对象,以便它们可以自己安排到列表中.有一个Boost库,显然是:Boost.Intrusive.

你说不动?

我会诚实地挑战大多数认为不应该移动物体的设计.移动的唯一问题是与对象标识以及使指向移动对象的指针无效的潜在问题(因此背后隐藏指针)的潜在问题.这通常可以通过智能指针和/或工厂方法来解决.


Mr.*_*C64 5

我会选择方法#1:即在 STL 容器中存储指向对象的智能指针。

请注意,将不拥有的原始指针存储在 STL 容器中是可以的(例如观察原始指针),但存储拥有的原始指针是一种“泄漏行为”:使用shared_ptr或新的 C++11unique_ptr代替。

至于#2,从头开始编写自己的容器需要大量的时间和精力,我相信您无法在合理的时间范围内匹配完整的商业质量 STL 库实现的丰富性。