为什么map的元素不需要复制或移动构造函数,而vector需要?

Why map's elements don't need copy or move constructors but vector's do?

本文关键字:构造函数 vector 需要 移动 map 元素 不需要 复制 为什么      更新时间:2023-10-16

我有这个类:

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将元素存储在连续的缓冲区中。每当缓冲区重新分配时(通常可以足够),就需要移动元素本身。因此,必须这样做。