用户定义类型和C ++中的std :: vector

时间:2018-12-21 05:55:50

标签: c++ vector std user-defined-types

我正在尝试在C ++中创建2D点向量。我的问题是在使用std :: vector存储点之前是否需要为2D点定义复制构造函数,赋值运算符和默认构造函数? 另外,如何为std库中定义的向量重载运算符/使其成员函数? 感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

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

如果您有一个简单的类型,例如struct Point { int x, y; };,则该类型已经具有良好的复制语义,您无需执行其他任何操作。如果您的类包含本身具有良好复制语义的其他对象,则同样适用,因此,如果您想在类型中包含std::string,例如, struct NamedPoint { std::string name; int x, y; };

通常,当类必须在析构函数中执行某些操作(例如删除一些内存)时,就会出现问题。然后,您需要编写一个赋值运算符并复制构造函数。

可以找到更多详细信息here

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

答案 1 :(得分:1)

  

我的问题是在使用std :: vector存储点之前是否需要为2D点定义复制构造函数,赋值运算符和默认构造函数?

来自cppreference

  

T必须满足CopyAssignable和CopyConstructible的要求。 (直到C ++ 11)

     

对元素施加的要求取决于对容器执行的实际操作。通常,要求元素类型是完整类型并满足Erasable的要求,但是许多成员函数提出了更严格的要求。 (自C ++ 11起)(直到C ++ 17)

     

对元素施加的要求取决于对容器执行的实际操作。通常,要求元素类型满足Erasable的要求,但是许多成员函数提出了更严格的要求。如果分配器满足分配器完整性要求,则可以使用一个不完整的元素类型实例化此容器(但不能使用其成员)。 (自C ++ 17起)

通常,是的,您需要一个复制构造函数,一个赋值运算符和一个默认构造函数。但是可以隐式提供它们,这意味着它们将由编译器生成。查看this question,以了解在什么情况下隐式定义了什么。

  

此外,如何为std库中定义的向量重载运算符/使其成员函数?

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