C++ 在std::pair:C+中使用'std::make_pair'+;STL

C++ 在std::pair:C+中使用'std::make_pair'+;STL,c++,stl,std-pair,C++,Stl,Std Pair,我多次注意到,每当需要为(新的)std::pair赋值时,就会使用std::make\u pair。但是我没有发现使用make\u pair函数,因为我们可以直接将值输入到一个pair中,并根据需要修改它们。 例如: std::pair<int,int> newp; std::cin>>newp.first>>newp.second; newp.first = -1; std::pair<int,int> newp; std::cin>&g

我多次注意到,每当需要为(新的)
std::pair
赋值时,就会使用
std::make\u pair
。但是我没有发现使用
make\u pair
函数,因为我们可以直接将值输入到一个pair中,并根据需要修改它们。 例如:

std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;
std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;
std::pairnewp;
标准::cin>>新的第一个>>新的第二个;
newp.first=-1;

那么这个函数到底有什么用呢?

有,它的优点就是调用。它节省了一点输入,并允许您使用
auto
。类模板参数必须显式指定,函数不得显式指定


但是它变得多余,因为我们将使用来创建具有指定值的
std::pair
对象

创建一个std::pair对象,从参数类型推断目标类型

作为支持自动模板参数类型推断的模板函数,它允许您省略指定目标模板参数类型。e、 g

auto p1 = std::make_pair(1, 2);  // p1 is std::pair<int, int> with value {1, 2}
auto p1=std::make_pair(1,2);//p1是std::pair,值为{1,2}
我们可以直接向一对输入值,并根据需要修改它们。 例如:

std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;
std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;
std::make_pair
解决了这三个问题,使代码更易于阅读。请注意,您不必重复该对的模板参数:

void createAndPrintPairTwice(Foo const& foo, Bar const& bar)
{
    std::pair<Foo, Bar> const pair = std::make_pair(foo, bar);
    printPair(pair);
    printPair(pair);
}

现在,请尝试使用没有默认构造函数的类型执行此操作。@milleniumbug:Valid observation,但在
std::make_pair
中也存在同样的问题。从根本上说,这是语言和库之间的设计问题。您无法编写由输入流顺序初始化的对象声明的异构列表。最接近的方法是定义使用流参数的构造函数,以及对内置类型的流进行转换操作。你仍然需要用那种风格重复很多流名称。可能是重复的是的,我现在明白了。它现在只在某些地方有用!