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'声明未编译。
这两个陈述之间有什么区别?
答案 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引用。