gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:27:48 24 4
gpt4 key购买 nike

我有这门课:

class Object {
public:
Object();
Object(const Object&) = delete;
Object& operator=(const Object&) = delete;
~Object();
};
  • 删除了默认的复制构造函数和赋值运算符,

  • 没有移动构造/分配操作。声明,

  • 并且也没有隐式移动构造/分配操作。因为声明了一个析构函数。

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

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

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

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

但是当我尝试将它存储在 std::map 中时:

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

它工作得很好。为什么?

最佳答案

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

std::vector 将元素存储在连续缓冲区中。每次重新分配缓冲区(这可能已经足够了),元素本身也需要移动。所以这一定是可能的。

关于c++ - 为什么 map 的元素不需要复制或移动构造函数,而 vector 的元素需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41331639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com