为什么map的元素不需要复制或移动构造函数,而vector需要?
Why map's elements don't need copy or move constructors but vector's do?
我有这个类:
class Object {
public:
Object();
Object(const Object&) = delete;
Object& operator=(const Object&) = delete;
~Object();
};
默认复制构造函数&分配操作员已删除,
无移动约束/assign op。声明,
,也没有隐含的移动约束/ASSIGN OP。因为有一个破坏者声明。
当我尝试将其存储在std::vector
中时:
std::vector<Object> objects;
objects.emplace_back();
它给出了一个编译错误,因为对象没有复制构造函数/移动c./etc。
- (需要调整对象时,必须复制/移动到新容器)
但是,当我尝试将其存储在std::map
中时:
std::map<int, Object> objects;
objects.emplace(std::piecewise_construct,
std::make_tuple(1),
std::make_tuple()
);
它运行完美。为什么?
std::map
是基于节点的容器(例如,红黑树)。这些元素存储在内部节点结构中,该结构可以内部移动。要重新定位元素,它只需要更新一些指针,就不需要移动元素本身。
std::vector
将元素存储在连续的缓冲区中。每当缓冲区重新分配时(通常可以足够),就需要移动元素本身。因此,必须这样做。
相关文章:
- 编译器如何区分std::vector的构造函数
- 为什么std::vector和std::valarray初始化构造函数不同
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- push_back std::vector,则重复调用复制构造函数
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 双重调用传递给 std::vector::emplace_back 的类的复制构造函数
- std::vector 是否有用于引用的复制构造函数?
- 我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- std::vector 范围构造函数可以调用显式转换吗?
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- std::vector 默认构造函数可以抛出异常吗?
- bad_alloc 在 std::vector 构造函数中
- c std :: vector迭代器构造函数,first == last
- 将 std::vector emplace_back() 与 std::p air 一起使用,并带有构造函数初始值设定项
- 组合 std::vector 默认值和填充构造函数
- 在不调用构造函数的情况下创建 Vector 元素