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