stl map insert operator []对差异

时间:2012-09-13 19:17:05

标签: dictionary stl insert operator-keyword

map<pair<double,double>,double> vectorDoubleMap;

vectorDoubleMap[ pair<double, double>(10, 10) ] = 1;          //1.
vectorDoubleMap.insert( pair<double, double>(10, 10), 1);     //2.

'1'。语句编译完成,但'2'声明未编译。

这两个陈述之间有什么区别?

2 个答案:

答案 0 :(得分:1)

map::insert接受一对参数保存键和值,而不是键和值作为单独的参数。如果你传递第二个参数,第一个是迭代器,用作相似插入位置的提示,而第二个仍然是一对。

所以你必须写下其中一个:

vectorDoubleMap.insert(pair<pair<double, double>, double>(pairs<double, double>(10, 10), 1));
vectorDoubleMap.insert(make_pair(make_pair(10, 10), 1));

在这种情况下,您可以看到make_pair如何使语法更简洁。 (由于数字是作为整数文字输入的,因此首先会构造整数对,但是对于另一种类型的对,有一个conversion constructor,所以这很好,并且将根据需要转换为double。编译器甚至可以优化整数,并在它生成的代码中直接使用双精度。)

如果映射中不存在该键,则这两个语句的效果相同且性能相似。如果密钥已存在,[…]=…表单将覆盖它,而insert(…)表单将保留旧值。

请注意,C ++ 17可能会提供另外两种方法来完成同样的事情。 insert_or_assign大致相当于您的第一行,因为它会覆盖现有值。 try_emplace更像是第二个,因为如果密钥已经存在,它将不会覆盖。这两个方面的关键好处是它们接受构造函数的参数,并在适当的位置构造对象。这对double没什么用处,但可能对其他难以构造,复制或移动的对象有用。但是,try_emplace采用单独的参数而不是单个pair的事实使得这个参数成为上面讨论的insert的一个很好的替代。

vectorDoubleMap.insert_or_assign(make_pair(10, 10), 1);
vectorDoubleMap.try_emplace(make_pair(10, 10), 1);

答案 1 :(得分:0)

看一下insert函数,你应该使用一对插入:

vectorDoubleMap.insert( pair<pair<double,double>,double>(pair<double, double>(10, 10), 1));

或利用make_pair函数使代码清洁:

vectorDoubleMap.insert( std::make_pair(pair<double, double>(10, 10), 1));

当您遇到编译器错误时,首先要做的是阅读错误消息并检查api引用。