stl map insert operator []对差异

问题描述 投票:1回答:2
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'声明未编译。

这两个陈述有什么区别?

dictionary stl insert operator-keyword
2个回答
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);

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引用。

© www.soinside.com 2019 - 2024. All rights reserved.