我注意到很多次,只要需要为(新)std::pair
分配值,就会使用std::make_pair
。但我没有找到make_pair
函数的任何用法,因为我们可以直接将值输入到一对,并根据需要修改它们。
例如:
std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;
那究竟是什么功能使用?
答案 0 :(得分:5)
有,其优势称为Template argument deduction。它可以节省一些输入,并允许您使用auto
。必须明确指定 class-template 参数, functions ,不得。
但C++17会变得多余,因为我们会Template Argument Deduction For class-templates
答案 1 :(得分:5)
std::make_pair
用于创建具有指定值的std::pair
对象。
创建一个std :: pair对象,从参数类型中推导出目标类型。
作为支持自动模板参数类型推导的模板函数,它允许您省略指定目标模板参数类型。如,
auto p1 = std::make_pair(1, 2); // p1 is std::pair<int, int> with value {1, 2}
答案 2 :(得分:2)
我们可以直接将值输入到一对,并根据需要修改它们。 例如:
std::pair<int,int> newp; std::cin>>newp.first>>newp.second; newp.first = -1;
我能想到的一些问题:
您并不总是准备好流对象。 std::cin
是一个非常特殊的案例,std::make_pair
是一个非常泛型函数。
谁说这对中的两种类型都支持operator>>
?
Const正确性。您可能希望拥有const
对。
让我们把这三件事放在一起创建一个非编译示例:
#include <utility>
#include <iostream>
struct Foo
{
int i;
};
struct Bar
{
double d;
};
void printPair(std::pair<Foo, Bar> const& pair)
{
std::cout << pair.first.i << " " << pair.second.d << "\n";
}
void createAndPrintPairTwice(Foo const& foo, Bar const& bar)
{
// error 1: no std::cin, need to use foo and bar
// error 2: no operator>> for Foo or Bar
// error 3: cannot change pair values after initialisation
std::pair<Foo, Bar> const newp;
std::cin >> newp.first >> newp.second;
printPair(newp);
printPair(newp);
}
int main()
{
Foo foo;
foo.i = 1;
Bar bar;
bar.d = 1.5;
createAndPrintPairTwice(foo, bar);
}
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);
}
真正的是,C ++ 11渲染std::make_pair
的功能比以前少得多,因为你现在也可以写:
void createAndPrintPairTwice(Foo const& foo, Bar const& bar)
{
auto const pair = std::pair<Foo, Bar> { foo, bar };
printPair(pair);
printPair(pair);
}