make_pair 和花括号 { } 在 C++ 中分配一对的区别?
Difference between make_pair and curly brackets { } for assigning a pair in C++?
我没有找到任何人回答这个问题,以下内容之间有什么区别吗:
v.push_back({x, y});
和:
v.push_back(make_pair(x, y));
假设 v 是这样声明的:
vector<pair<int,int> > v;
我在在线编译器中试过这个,据我所知,make_pair 的优化程序集与 {} 语法相同。
我认为您接受该答案的速度可能有点太快了。普遍接受的方法是这样的:
vec.emplace_back (x, y);
如果你看一下 Godbolt,你会发现它内联了所有内容(这可能是你想要的,也可能不是你想要的):
运行 它在 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 done\n";
vec.push_back({x, y});
std::cout << "push_back done\n";
vec.emplace_back (x, y);
std::cout << "emplace_back done\n";
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
当然,如果您预先在向量中保留适当数量的元素,一切都会运行得更快。也许那是提出这个问题的人真正想让你说的。
v.push_back({x, y})
中的 {x, y}
是 v
的 value_type
的 aggregate initialization (since C++11),而 std::make_pair
是创建 [=16 的函数=] 的类型从它的参数中推导出来。
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
}
我没有找到任何人回答这个问题,以下内容之间有什么区别吗:
v.push_back({x, y});
和:
v.push_back(make_pair(x, y));
假设 v 是这样声明的:
vector<pair<int,int> > v;
我在在线编译器中试过这个,据我所知,make_pair 的优化程序集与 {} 语法相同。
我认为您接受该答案的速度可能有点太快了。普遍接受的方法是这样的:
vec.emplace_back (x, y);
如果你看一下 Godbolt,你会发现它内联了所有内容(这可能是你想要的,也可能不是你想要的):
运行 它在 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 done\n";
vec.push_back({x, y});
std::cout << "push_back done\n";
vec.emplace_back (x, y);
std::cout << "emplace_back done\n";
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
当然,如果您预先在向量中保留适当数量的元素,一切都会运行得更快。也许那是提出这个问题的人真正想让你说的。
v.push_back({x, y})
中的 {x, y}
是 v
的 value_type
的 aggregate initialization (since C++11),而 std::make_pair
是创建 [=16 的函数=] 的类型从它的参数中推导出来。
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
}