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

时间:2013-04-16 10:55:00

标签: c++ stl

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

  

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

嗯,实际上,对于C ++ 11,他们要求对象是Movable。由于emplace_*方法,只有某些操作要求它们可以分配。

  

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

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

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

  4.   

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

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

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

  

你说不动?

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

答案 1 :(得分:4)

我选择方法#1:即将 smart 指针存储到STL容器中的对象。

请注意,将非拥有原始指针存储在STL容器中是很好的(例如观察原始指针),但存储拥有原始指针是“leaktrocity “:改为使用 shared_ptr 或新的C ++ 11 unique_ptr

至于#2,从头开始编写自己的容器需要大量的时间和精力,而且我相信你无法在合理的时间范围内完全满足商业级STL库的丰富性。