使用复制昂贵的类作为std :: map中的映射值是否有效?

时间:2012-11-09 03:26:51

标签: c++ boost std c++-standard-library

简而言之,使用

是否有效
std::map<int, std::set<int> > instead of
std::map<int, boost::shared_ptr<std::set<int>>?

对于vector,我将选择boost :: shared_ptr。但是对于std :: map,我不确定它是否值得。

1 个答案:

答案 0 :(得分:3)

std::map::insert()的文档说http://en.cppreference.com/w/cpp/container/map/insert

  

没有迭代器或引用无效。

std::map::erase() http://en.cppreference.com/w/cpp/container/map/erase

  

擦除元素的引用和迭代器无效。其他引用和迭代器不受影响。

这意味着插入或擦除都不会移动对象,因此您不必担心复制费用,除非您需要将已创建的大对象插入到地图中。但在这种情况下,我会使用std::map::emplace()方法和/或移动语义,而不是使用共享指针复杂化代码。