【问题标题】:How to insert pair into map如何将对插入地图
【发布时间】:2010-02-22 15:24:30
【问题描述】:

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

既然我试图插入一对和一个对象并且我必须制作一对,我该怎么做?

我应该使用make_pair() 从我拥有的对和对象中创建一个新对吗?如果是这样,你能告诉我怎么做吗?

【问题讨论】:

  • 你试过什么代码?

标签: c++ insert map


【解决方案1】:
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));

【讨论】:

  • 我使用了您的第一个建议 - 简洁明了。非常感谢!
  • 如果您在代码中经常使用它,您可能希望将地图包装在一个带有插入(对、对象)函数的类中以提高可读性。
【解决方案2】:

假设您使用的是 C++11 或更高版本,最好的方法可能是:

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

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

我曾经推荐过这个,它也只适用于 C++11 或更高版本:

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

这避免了 emplace 的使用有点令人惊讶,但如果键或值类型是仅移动的(例如 unique_ptr),它以前不起作用。这已在标准中得到修复,但您的标准库实现可能尚未得到修复。从理论上讲,这也可能效率稍低,但任何一半体面的编译器都可以轻松优化掉。

【讨论】:

  • 我认为官方答案和这个应该根据编译器版本标准合并
【解决方案3】:

有两种方式:

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. 更简单,但如果它不存在,则首先默认构造对象,然后分配而不是复制构造对象

如果您不必担心性能,只需选择是否要删除之前的条目。

【讨论】:

  • 正确,但问题是关于一个键类型也是一对的地图。
  • 我看不到依赖关系。 sed s/1/std::make_pair(1,1)/g 和适当定义的 map_t。它不会改变 cmets 或任何东西,我只是更喜欢用简单的概念来演示,以帮助专注于重点,而不是将它们隐藏在人群中。
【解决方案4】:
int a=10,b=20;

map < pair < int,int >, int > m;

pair < int,int >numbers = make_pair(a,b);

int sum=a+b;

m[numbers]=sum;

我们的地图将其键作为数字对。我们可以使用点(。)运算符访问对变量的整数值。

【讨论】:

  • 你能解释一下为什么你的答案比公认的答案更受欢迎吗?仅代码答案不会为将来的读者提供太多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多