用户定义的类型和C 中的STD ::向量
User Defined types and std::vector in C++
我正在尝试在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
名称空间添加一些代码,但这不是其中之一。
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 理解GCC中的std::pow实现
- 捕获lambda中的std::数组
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 标准::unordered_map 中的 std::array 的值初始化
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 如何处理给定代码中的 std::out_of_range 错误?
- 为什么目录中的 std::filesystem::file_size 留给实现?
- C++ - 向量中的 std::unique_ptr <> 为 nullptr
- 为什么这个程序接受整数和字母数字输入并打印它们? C++ 中的 std::string 也采用整数值吗?
- 访问基于范围的循环(如for_each)中的std::map迭代器
- 意外的模板与VC++中的std::void_t匹配
- 为什么一个表达式中的 std::string 连接给出的结果与逐个字符不同的结果?
- 如何识别容器中的 std::function 并将其删除?
- 列表中的 std::min_element 不返回最小值
- 将组合框信号连接到 Qt 中的 std::function 时出现问题