make_pair和大括号 { } 之间的区别,用于在C++中分配一对?

Difference between make_pair and curly brackets { } for assigning a pair in C++?

本文关键字:C++ 用于 分配 区别 pair 之间 make      更新时间:2023-10-16

我没有找到任何人回答这个问题,以下有什么区别:

v.push_back({x, y});

和:

v.push_back(make_pair(x, y));

假设 v 是这样声明的:

vector<pair<int,int> > v;

我想你可能太快接受了这个答案。 普遍接受的方法是这样的:

vec.emplace_back (x, y);

如果你看一下Godbolt,你可以看到它内联了所有内容(这可能是你想要的,也可能不是你想要的(:

https://godbolt.org/z/aCl02d

在Wandbox上运行它:

https://wandbox.org/permlink/uo3OqlS2X4s5YpB6

法典:

#include <vector>
#include <iostream>
int x = 1;
int y = 2;
std::vector<std::pair<int,int>> vec;
int main () {
vec.push_back(std::make_pair(x, y));
std::cout << "make_pair donen";
vec.push_back({x, y});
std::cout << "push_back donen";
vec.emplace_back (x, y);
std::cout << "emplace_back donen";
for (std::pair <int, int> p : vec)
{
std::cout << p.first << ", " << p.second << "n";
}
}

输出:

make_pair done
push_back done
emplace_back done
1, 2
1, 2
1, 2

当然,如果您在预先保留矢量中适当数量的元素,一切都运行得更快。 也许这就是提出这个问题的人真正想让你说的话。

我在在线编译器中尝试过这个,据我所知,make_pair优化的程序集与 {} 语法相同。

https://godbolt.org/z/P7Ugkt

v.push_back({x, y})中的{x, y}vvalue_type的聚合初始化(自C++11以来(,而std::make_pair是一个函数,使用从其参数推导出的类型创建std::pair

push_back({x, y})相对于emplace_back(x, y)的一个优点是,你可以像这样保持小结构简单(没有构造函数(:

#include <vector>
struct A {
int x;
int y;
// A(int _x, int _y) : x{_x}, y{_y} {}
};
int f()
{
std::vector<A> v;
v.push_back({1, 2});
// v.emplace_back(1, 2); // doesn't compile unless constructor is uncommented
}

例。