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

问题描述 投票:2回答:2

必须将不可复制类的实例填充到映射中。例如下面的代码:

#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

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

非常感谢!

c++ dictionary copy-constructor
2个回答
2
投票

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

emplace()

0
投票

尝试一下:

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; my_map.insert(std::make_pair(3, 30)); // or my_map.emplace(std::make_pair(4, 40)); // or my_map.emplace(5, 50); // or my_map.emplace(std::piecewise_construct, std::forward_as_tuple(6), std::forward_as_tuple(60)); // or (from C++17) my_map.try_emplace(7, 70); return 0; }

选项:

  1. 使用live的移动构造函数,
  2. 使用std::pair的转换移动构造函数
  3. 使用std::pair的模板构造函数
  4. 使用std::pair的分段构造函数
  5. 如果容器中已存在密钥,则不执行任何操作;否则,其行为类似于std::pair,不同之处在于该元素被构造为value_type
© www.soinside.com 2019 - 2024. All rights reserved.