C++ STL 容器插入副本
C++ STL container insertion copy
我试图用std::vector编写用户定义的对象。
我读到对于用户定义的类,如果复制构造函数和赋值运算符是公共的,那么只有一个可以在 STL 容器中插入其对象。
这是因为两个原因:
- 所有 STL 包含始终存储插入对象的副本,而不是实际对象的副本。因此,每当我们在容器中插入任何元素或对象时,都会调用它的复制构造函数来创建副本,然后将此副本插入到容器中。
- 在 std::vector 中插入时,由于空间不足,存储重新定位可能会在内部进行。在这种情况下,将对容器内的对象调用赋值运算符,以将它们从一个位置复制到另一个位置。
为什么所有 STL 容器总是存储插入对象的副本,而不是实际对象的副本?
我不明白为什么他们不允许存储实际对象的原因。 缺点是什么?
C++中的标准容器分配它们管理的内存。 如果您的程序创建了一个对象,则该对象位于另一个内存位置,因此要成为容器的一部分,则会在容器的内存中创建副本。
代替复制,本来可以完成移动,但在很多情况下,这不会更有效率,有时甚至可能非常不方便。
避免复制的一个很好的解决方案是使用emplace-functions直接在容器中创建对象。
关于向量增长,因为新向量可能必须位于不同的内存地址并且内存包含对象,因此必须移动或复制它们。此答案显示了如何在调整大小时使矢量移动。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- Visual Studio 2019:插入多个C++风格的单行注释
- nlohmann-json将一个数组插入到另一个数组中
- 有效地使用std::unordered_map来插入或增加键的值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 正在插入动态数组
- 插入或删除时获取usb的dos_name
- 用callgrind追踪不必要的副本
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 叮叮当当在修复时插入多个"覆盖"说明符
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++ STL 容器插入副本
- 在一个映射向量上迭代,如果满足条件,则插入一个副本
- vector插入对象的副本或引用