在 std::pair 中使用 `std::make_pair`:C++ STL
Use of `std::make_pair` in std::pair : C++ STL
我多次注意到,每当需要为(新)std::pair
赋值时,都会使用 std::make_pair
。但是我没有发现 make_pair
函数有任何用处,因为我们可以直接将值输入到一对中,然后随意修改它们。
例如:
std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;
那么这个功能到底有什么用呢?
有,它的优点叫做Template argument deduction。它节省了一些输入,并允许您使用 auto
。 class-template arguments 必须明确指定,functions,不能。
但它变得多余 , because we will have Template Argument Deduction For class-templates
std::make_pair
用于创建具有指定值的std::pair
对象。
Creates a std::pair object, deducing the target type from the types of arguments.
作为支持自动模板参数类型推导的模板函数,它允许您省略指定目标模板参数类型。例如,
auto p1 = std::make_pair(1, 2); // p1 is std::pair<int, int> with value {1, 2}
we can directly input values to a pair, and modify them as we like.
For example:
std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;
我能想到的一些问题:
您并不总是准备好流对象。 std::cin
是一个非常特殊 的情况,std::make_pair
是一个非常通用 的函数。
谁说pair中的两种类型都支持operator>>
?
常量正确性。您可能想要一对 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);
}
我多次注意到,每当需要为(新)std::pair
赋值时,都会使用 std::make_pair
。但是我没有发现 make_pair
函数有任何用处,因为我们可以直接将值输入到一对中,然后随意修改它们。
例如:
std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;
那么这个功能到底有什么用呢?
有,它的优点叫做Template argument deduction。它节省了一些输入,并允许您使用 auto
。 class-template arguments 必须明确指定,functions,不能。
但它变得多余
std::make_pair
用于创建具有指定值的std::pair
对象。
Creates a std::pair object, deducing the target type from the types of arguments.
作为支持自动模板参数类型推导的模板函数,它允许您省略指定目标模板参数类型。例如,
auto p1 = std::make_pair(1, 2); // p1 is std::pair<int, int> with value {1, 2}
we can directly input values to a pair, and modify them as we like. For example:
std::pair<int,int> newp; std::cin>>newp.first>>newp.second; newp.first = -1;
我能想到的一些问题:
您并不总是准备好流对象。
std::cin
是一个非常特殊 的情况,std::make_pair
是一个非常通用 的函数。谁说pair中的两种类型都支持
operator>>
?常量正确性。您可能想要一对
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);
}