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

STL containers and non copyable (and non movable) objects

本文关键字:对象 可移动 可复制 STL      更新时间:2023-10-16

既然STL容器要求所有内容都是可复制和可分配的,那么在处理不可复制对象时,首选的习惯做法是什么?

我能想到两种不同的方法:

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

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

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

既然STL容器要求所有内容都是可复制和可分配的,那么在处理不可复制对象时,首选的习惯用法是什么?

实际上,c++ 11要求对象是可移动的。多亏了emplace_*方法,只有某些操作需要它们是可赋值的。

我能想到两种不同的方法:

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

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

这两种方法肯定是可行的。

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

如果它是可察觉的,或者如果你不能使用c++ 11,那么你应该学习侵入性容器,它包括用钩子增加你的对象,这样他们就可以把自己安排到列表中,例如。有一个Boost库可以解决这个问题,很明显:Boost. invasive .

不可移动你说?

老实说,我要挑战大多数认为物体不应该移动的设计。移动的唯一问题与对象标识有关,以及指向被移动对象的指针失效的潜在问题(从而导致后面的悬浮指针失效)。这通常可以通过智能指针和/或工厂方法解决。

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

请注意,在STL容器中存储非拥有的原始指针是可以的(例如观察原始指针),但是存储拥有的原始指针是一个"泄漏":使用 shared_ptr 或新的c++ 11的 unique_ptr

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