如何在没有复制构造函数的情况下为地图设置值?

How to set value to a map without copy constructor?

本文关键字:情况下 地图 设置 构造函数 复制      更新时间:2023-10-16

必须将不可复制类的实例填充到映射中。例如,使用此代码:

#include <map>
class NoCopyClass
{
public:
NoCopyClass() {};
NoCopyClass(int value)  {};
NoCopyClass& operator=(const NoCopyClass&) = delete;
};
int main()
{
std::map<int, NoCopyClass> my_map;
my_map[3] = NoCopyClass(20);
}

除非您注释掉复制构造函数的删除,否则这将无法编译。 你可以在这里尝试一下:https://onlinegdb.com/ByBh0NubU

当类不可复制时添加新地图元素的正确方法是什么?

非常感谢!

尝试使用emplace()就地构造对象,而不是复制已构造的对象:

int main()
{
std::map<int, NoCopyClass> my_map;
my_map.emplace(3, 20);
}

试试这个:

#include <map>
class NoCopyClass {
public:
NoCopyClass() {};
NoCopyClass(int value)  {};
NoCopyClass& operator=(const NoCopyClass&) = delete;
};
int main() {
std::map<int, NoCopyClass> my_map;
// 1. option
my_map.insert(std::make_pair(3, 30));
// or 2. option
my_map.emplace(std::make_pair(4, 40));
// or 3. option
my_map.emplace(5, 50);
// or 4. option
my_map.emplace(std::piecewise_construct,
std::forward_as_tuple(6),
std::forward_as_tuple(60));
// or 5. option (from C++17)
my_map.try_emplace(7, 70);
return 0;
}

现场查看

选项:

  1. 使用std::pair的移动构造函数,
  2. 使用std::pair的转换移动构造函数
  3. 使用std::pair的模板构造函数
  4. 使用std::pair的分段构造函数
  5. 如果容器中已存在键,则它不执行任何操作;否则,其行为类似于emplace,只是元素构造为value_type