是否可以在没有任何复制操作符的类中使用C++中的std :: map?

Tux*_*xer 13 c++ constructor stdmap copy-constructor

我正在使用没有任何复制操作符的Class(Object):它现在基本上无法复制.我有一个

std::map<int,Object> objects

列出具有int标识符的对象的变量.如何在不使用复制运算符的情况下将Object添加到此映射中?我试过了

objects.insert(std::pair<0,Object()>);

但那不会编译.我想最初使用默认构造函数在地图内部创建我的对象,但是写作

objects[0]; 失败...谢谢:)

Jas*_*son 11

在C++ 03中,存储在STL容器中的对象必须是可复制的.这是因为STL容器std::allocator实际上使用new运算符的放置版本来复制构造预分配内存块中的对象,并且需要复制构造函数的存在来复制您想要添加的对象的实际实例将容器放入容器分配器预先分配的内存地址中.因此,您唯一的选择是存储指向对象的指针而不是对象本身.因此,您可以执行以下操作:

std::map<int, std::shared_ptr<Object> > objects;
objects.insert(std::pair<int, std::shared_ptr<Object> >(0, new Object());
Run Code Online (Sandbox Code Playgroud)

  • 内存泄漏,内存泄漏! (6认同)
  • 如果你使用智能指针,会给一个upvote.手动删除代码是不好的. (3认同)

Pup*_*ppy 6

不是在C++ 03中.如何在不使用复制构造函数的情况下将对象从现在的任何位置获取到地图中?

在C++ 0x中,您可以移动到地图中,理论上,完全可以从其他参数构建一个.

编辑:您可以交换它,如果它的热插拔,并且可以使用默认构造它原地operator[].

std::map<int, Object> objmap;
objmap[2]; // Default-constructs an Object in-place
std::swap(objmap[2], Object()); // Swaps it into the map.
Run Code Online (Sandbox Code Playgroud)