为什么地图的元素不需要复制或移动构造函数,但矢量是什么?

时间:2016-12-26 12:55:11

标签: c++ c++11 dictionary vector containers

我有这堂课:

class Object {
public:
    Object();
    Object(const Object&) = delete;
    Object& operator=(const Object&) = delete;
    ~Object();
};
  • 默认的复制构造函数& assign operator被删除,

  • no move constr./assign op。声明,

  • 并且也没有隐含的移动constr./assign op。因为声明了析构函数。

当我尝试将其存储在std::vector

中时
std::vector<Object> objects;
objects.emplace_back();

它给出了编译错误,因为Object没有复制构造函数/ move c./etc。

  • (这是必需的,因为在调整对象大小时必须复制/移动到新容器)

但是当我尝试将其存储在std::map

std::map<int, Object> objects;
objects.emplace(std::piecewise_construct,
    std::make_tuple(1),
    std::make_tuple()
);

完美无缺。为什么?

1 个答案:

答案 0 :(得分:3)

std::map是基于节点的容器(例如,red-black tree)。元素存储在内部节点结构中,地图可以在内部移动。要重新定位元素,只需要更新一些指针,它不需要移动元素本身。

std::vector将元素存储在连续的缓冲区中。每次重新分配缓冲区(通常都足够)时,需要移动元素本身。所以一定有可能这样。