除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
Is there a std container, other than std::vector, which does not copy and destroy elements which are classes?
我知道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 = "";
其中两个成员,即EventHandler
、VertexArrayObject
,是类,它们本身包含类的成员。
当我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);
情况也好不到哪里去。
是否有我可能使用的 std 容器,它不会制作、存储和销毁所添加元素的副本?
每个相关类的深层复制构造函数能否解决问题?
标准的"C"样式数组会起作用吗?
我已经养成了使用std::vector
代替非类对象的"C"样式数组的习惯,所以这是一种全新的体验。
你这里有两个问题。
-
您的类不是复制安全的。
无论如何,这是一个问题。如果你不希望你的类有深度复制语义,那么他们不必这样做......但是它应该被安全地复制(通过不拥有和破坏它们所引用的资源(,或者至少应该变得不可复制。
或者,正如您所说,使它们可进行深度复制(尽管这可能不是您想要的(。
-
您正在不必要地复制。
push_back
不必复制。有一个push_back(T&&)
.因此,请考虑改为将对象
std::move
到矢量中。在WindowsWindow
中正确实现移动构造函数和移动赋值运算符,这将是非常便宜的。您也可以直接
emplace
构造元素。
这些都不是std::vector
的错,创建一个不这样做的替换向量类型只会是围绕类损坏的复制/移动语义的一个奇怪的黑客。
tl;DR:为您的类正确实现复制和移动语义。
- 使用std::transform将一个范围的元素添加到另一个范围中
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何从存储在std::映射中的std::集中删除元素
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- std::矢量保存 只推送最后一个元素
- std::map:当元素不可默认构造时创建/替换元素
- 如何读/写或遍历 std::array 中的特定元素范围?
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 为什么 std::p air 的大小与其元素的大小之和不同?
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 使用 std::min_element、std::max_element 查找矢量中的最小和最大元素
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- call call cons构件功能的std ::元素的每个元素