2010-02-22 70 views
12

我有以下地图结构:map < pair < int,int >, object* >,我希望将其插入到地图中。如何将地图插入地图

我会怎么做,因为我想插入一对和对象我必须做一对出来的呢?

我应该使用make_pair()创建一对新对吗?如果是这样,你可以让我知道如何做到这一点?

+5

你试过了什么代码? – Mark 2010-02-22 15:26:55

回答

20
object * myObject = // get an object somehow 
myMap.insert(std::make_pair(std::make_pair(1,2), myObject)); 

typedef map<pair<int, int>, object *> MapType; 
object * myObject = // get an object somehow 
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject)); 
+0

我用你的第一个建议 - 很好,简洁。非常感谢! – Myx 2010-02-22 15:49:33

+2

如果您在代码中使用了很多代码,您可能需要使用插入(pair,object)函数将该地图包装到类中以提高可读性。 – 2010-02-22 16:00:14

1

有两种方式:

typedef std::map<int,Object> map_t; 
map_t map; 
Object obj; 

std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1 

map[1] = obj; // 2 
  1. 只有工作,如果关键是不存在的,迭代器指向对与键值并且bool表示它是否已被插入。

  2. 容易,但如果它不存在的物体首先被默认构造,然后分配而不是拷贝构造

如果您不必担心性能,只是是否选择或者不想删除以前的条目。

+0

正确,但问题是关于一个关键类型也是一对的地图。 – 2010-02-22 15:30:02

+0

我无法看到依赖关系。 'sed s/1/std :: make_pair(1,1)/ g'和适当定义的'map_t'。它不会改变评论或任何内容,我只是喜欢用简单的概念来演示,以帮助关注重点而不是隐藏在人群中。 – 2010-02-23 16:05:18

10

假设你正在使用C++ 11或更高,最好的办法可能是:

object * myObject = // get an object somehow 
myMap.emplace({1,2}, myObject); 

对于地图,emplace可以作为一个版本的insert,是以键和值作为单独的被认为是参数(它实际上可以采用对应的类型的构造函数可以采用的参数的任意组合)。除了语法上更清洁以外,它还可能比make_pair更有效,因为make_pair通常会生成一个输出,其类型与容器的value_type不完全匹配,因此会导致不必要的类型转换。

我曾经建议这一点,这也只适用于C++ 11或更高版本:

object * myObject = // get an object somehow 
myMap.insert({{1,2}, myObject}); 

这就避免了略微令人惊讶的使用emplace,但以前没有如果键或值工作类型是仅移动的(例如unique_ptr)。这已经在标准中得到了修复,但您的标准库实现可能还没有找到修复。这在理论上可能效率稍低一些,但是通过这种方式,任何中等程度的编译器都可以轻松优化。

+0

我认为官方答案和这一个应根据编译器版本标准进行合并 – Aviv 2017-12-03 06:37:33