C++ 为什么std::map需要一对?
该语法:C++ 为什么std::map需要一对?,c++,stl,C++,Stl,该语法: std::map<int, int> m; m.insert(std::make_pair(1, 42)); 是的,我知道m[1]=42,但它也有自己的问题(创建值对象的额外副本)。我无法告诉您为什么不允许这种构造。也许要保持insert类似于其他容器的insert方法。然而,自从c++11以来,有一种方法可以满足您的需要 std::map<int, int> m; m.emplace(1, 42); std::map m; m、 炮位(1,42); m.i
std::map<int, int> m;
m.insert(std::make_pair(1, 42));
是的,我知道
m[1]=42
,但它也有自己的问题(创建值对象的额外副本)。我无法告诉您为什么不允许这种构造。也许要保持insert
类似于其他容器的insert
方法。然而,自从c++11以来,有一种方法可以满足您的需要
std::map<int, int> m;
m.emplace(1, 42);
std::map m;
m、 炮位(1,42);
m.insert(x,y)代码>强制复制两个参数;而m.insert(std::make_pair(1,42))
允许调用获取一个常量和对
,从而避免所有复制。这样,map
就可以包含不可压缩的对象(或重型复制对象)m.emplace(1,42)
?我想是一致性和历史性。我认为map
在被纳入标准库之前,在原始STL中已经是这样工作的,并且由于容器的值类型是成对的,所以使用成对作为参数类型是最合理的方式。好吧,operator[]
是事后才想到的,它被设计成一个(不一致的)便利函数,正好提供您所要求的“更明智”的选择。因此,通过std::make_pair
创建一对不会导致复制?恰恰相反,make_pair
方法鼓励创建类型错误的pair对象,无法直接传递到insert
,需要额外转换,即额外副本。你的例子实际上很好地说明了这个普遍的错误。您的make\u对
将创建一个
对,而insert
需要一个
对。编译器不会抱怨,因为前者可以隐式转换为后者。但是转换将创建一个临时副本。你好,不必要的复制@AnT你能在他的例子中详细说明make_对的错误吗?它不够常量?@MK。它的类型是std::pair
,而不是std::pair
。
std::map<int, int> m;
m.emplace(1, 42);