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

标签 c++ stl

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

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

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

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

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

最佳答案

Since STL containers require that all contents be copyable and assignable, what is the prefered idiom when working with non copyable objects?

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

I can think of two different approaches:

  1. Store (smart) pointers rather than the objects in STL containers.

  2. Get rid of STL containers and implement my own lists (e.g. each object must include a pointer to the next object).

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

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

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

Non Movable you said ?

老实说,我会质疑大多数认为不应移动对象的设计。移动的唯一问题与对象标识和使指向被移动对象的指针无效的潜在问题有关(因此在后面存在悬空指针)。这通常可以通过智能指针和/或工厂方法来解决。

关于c++ - STL 容器和不可复制(和不可移动)的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16035250/

相关文章:

C++:我在使用类搜索 vector 中的特定元素时得到了错误的结果

c++ - 如何将 QNetworkManager 用于 REST api?

c++ - 如何通过引用构造 vector 的子范围?

c++ - 如何在磁盘上存储一棵树并使添加/删除/交换操作变得容易

c++ - 迭代器值与转换后的反向迭代器值不同

c++ - 根据 C++ ISO 标准,什么是多次通过保证?

c++ - 多态对象列表

java - 在多线程应用程序中缓存 JNI 环境

c++ - std::for_each 处理多个迭代器范围

c++ - 我应该担心 std::vector 的内存碎片吗?