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);