除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?

Is there a std container, other than std::vector, which does not copy and destroy elements which are classes?

本文关键字:std 元素 复制 之外 vector 是否 有一个 除了      更新时间:2023-10-16

我知道std::vector::p ush_back((在vector中放了一个副本。我正在寻找一种不会破坏实例化类的类成员的方法或std容器。

我有一个班级,WindowsWindow成员,

private:
GLFWwindow* m_pGLFWwindow = nullptr;
EventHandler m_eventHandler;
VertexArrayObject m_VAO;
bool m_windowAvailable = true;
std::uint8_t m_windowNumber = 0;
std::string m_windowTitle = "";

其中两个成员,即EventHandlerVertexArrayObject,是类,它们本身包含类的成员。

当我std::vector::push_back()WindowsWindow对象的实例化到std::vector或上时,所有的类成员变量都被销毁,因为正在复制然后销毁。 也许答案是为每个类制作一个深拷贝构造函数,我没有尝试过。

我也试过,

std::vector<std::shared_ptr<WindowsWindow>> WindowsWindowVector;
std::shared_ptr<WindowsWindow> pmainWindow = std::make_shared<WindowsWindow>("Main Window", false);
...
WindowsWindowVector.push_back(pmainWindow);

情况也好不到哪里去。

  1. 是否有我可能使用的 std 容器,它不会制作、存储和销毁所添加元素的副本?

  2. 每个相关类的深层复制构造函数能否解决问题?

  3. 标准的"C"样式数组会起作用吗?

我已经养成了使用std::vector代替非类对象的"C"样式数组的习惯,所以这是一种全新的体验。

你这里有两个问题。

  1. 您的类不是复制安全的。

    无论如何,这是一个问题。如果你不希望你的类有深度复制语义,那么他们不必这样做......但是它应该被安全地复制(通过不拥有和破坏它们所引用的资源(,或者至少应该变得不可复制。

    或者,正如您所说,使它们可进行深度复制(尽管这可能不是您想要的(。

  2. 您正在不必要地复制。

    push_back不必复制。有一个push_back(T&&).

    因此,请考虑改为将对象std::move到矢量中。在WindowsWindow中正确实现移动构造函数和移动赋值运算符,这将是非常便宜的。

    您也可以直接emplace构造元素。

这些都不是std::vector的错,创建一个不这样做的替换向量类型只会是围绕类损坏的复制/移动语义的一个奇怪的黑客。


tl;DR:为您的类正确实现复制和移动语义。