用户定义的类型和C 中的STD ::向量

User Defined types and std::vector in C++

本文关键字:中的 STD 向量 定义 类型 用户      更新时间:2023-10-16

我正在尝试在C 中创建一个2D点的向量。我的问题是,在使用std :: vector存储点之前,我是否需要定义2D点的副本构造函数,分配运算符和默认构造函数?另外,如何为在STD库中定义的向量的过载操作员/制作成员功能?感谢您的帮助:)

用户定义的类型总是需要良好的复制语义。即使您不将它们放入向量,也是如此。将一个对象复制到另一个对象的意思是不同的,但是显然一个要求是这样做不应该崩溃程序。因此,真正的问题是您的用户定义类型是否具有良好的复制语义。显然没有看到类型很难说。

如果您有一个简单的类型,例如struct Point { int x, y; };,那么它已经具有良好的复制语义,并且您无需做更多的事情。如果您的课程包含其他具有良好复制语义的对象,则同样适用,因此,如果您想在您的类型中包含std::string,例如,没有问题。struct NamedPoint { std::string name; int x, y; };

通常,当课程必须在毁灭者中做某事(例如删除某些内存)时,问题出现。然后,您需要编写一个分配运算符和复制构造函数。

可以在这里找到更多细节。

ps您链接的讨论有些困惑。

我的问题是我是否需要定义复制构造函数,分配运算符和2D点的默认构造函数,然后再使用std :: vector存储点?

来自cppreference:

t必须满足CopyAssignable和CopyConstructional的要求。(直到C 11)

对元素施加的要求取决于在容器上执行的实际操作。通常,要求元素类型是一种完整的类型,并且满足可擦除的要求,但是许多成员功能都会征得更严格的要求。(由于C 11)(直到C 17)

对元素施加的要求取决于在容器上执行的实际操作。通常,要求元素类型符合可擦除的要求,但是许多成员功能会征得更严格的要求。如果分配器满足分配器的完整性要求,则可以将该容器(而不是其成员)实例化。(由于C 17)

通常,是的,您想要一个复制构造函数,一个分配运算符和默认构造函数。但是这些可以隐含地提供,这意味着它们将由编译器生成。查看这个问题,以了解在什么情况下到底定义了什么。

另外,如何超载运算符/制作std库中定义的向量的成员函数?

你不。标准库不得修改;充其量,您可以在某些情况下向std名称空间添加一些代码,但这不是其中之一。