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

C++ STL容器和不可复制(和不可移动)的对象,c++,stl,C++,Stl,既然STL容器要求所有内容都是可复制和可分配的,那么在处理不可复制的对象时,首选的习惯用法是什么 我可以想出两种不同的方法: 存储(智能)指针,而不是STL容器中的对象 摆脱STL容器并实现我自己的列表(例如,每个对象必须包含指向下一个对象的指针) 第二种方法的主要缺点是实现析构函数(是否应该以递归方式在当前对象之前销毁“下一个”对象?我会选择方法#1:即在STL容器中存储指向对象的智能指针 请注意,在STL容器中存储非拥有的原始指针是可以的(例如,观察原始指针),但存储拥有的原始指针是一种“泄

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

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

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

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

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

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

    请注意,在STL容器中存储非拥有的原始指针是可以的(例如,观察原始指针),但存储拥有的原始指针是一种“泄漏”:使用
    共享的\u ptr
    或新的C++11的
    唯一的\u ptr

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

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

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

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

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

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

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

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

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

    你说的不可移动


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

    当然这取决于具体情况,但我通常会投1票),因为出错的可能性较小。当然,您确实会失去一些东西,比如
    std::vector的缓存友好性。。。是2)
    的一个实现,因为STL容器要求所有内容都是可复制和可分配的
    我认为现在可移动性已经足够了?假设你真的是标准库。@ BobtFiod看起来像是对我的回答“因为STL容器要求所有内容都是可复制的和可分配的”——不,它们不(如果你是最新的C++标准库)。我想再看一个术语“漏漏”。你是说安全吗?嗯,我不是说实施我自己的容器。我的意思是用C语言实现我自己的链表。无论如何,第一种方法似乎更好。@user1916893:这意味着您必须非常小心地使用它以避免内存泄漏。您必须记住,原始指针拥有对象,简单地移除或替换它们将泄漏拥有的对象。智能指针以编译器可以检查的方式显式管理所有权;在@MikeSeymour明智的注释之外,拥有原始指针也存在异常安全问题。