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

Nou*_*ine 1 c++ std-pair

我没有找到回答这个问题的人,以下内容之间是否有区别:

v.push_back({x, y});
Run Code Online (Sandbox Code Playgroud)

和:

v.push_back(make_pair(x, y));
Run Code Online (Sandbox Code Playgroud)

假设v是这样声明的:

vector<pair<int,int> > v;
Run Code Online (Sandbox Code Playgroud)

Pau*_*ers 6

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

vec.emplace_back (x, y);
Run Code Online (Sandbox Code Playgroud)

而且,如果您查看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 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

make_pair done
push_back done
emplace_back done
1, 2
1, 2
1, 2
Run Code Online (Sandbox Code Playgroud)

当然,如果您预先在向量中保留了适当数量的元素,则一切运行都会更快。也许那是提出这个问题的人们真正要你说的。

  • 是的,我知道emplace_back比push_back快,非常感谢您指出来;)这并不是我对此问题的关注! (2认同)

Dev*_*ull 6

{x, y}inv.push_back({x, y})是s的聚合初始化 (C++11 起),而是创建 an 的函数,其类型从其参数推导而来。vvalue_typestd::make_pairstd::pair

push_back({x, y})over的一个优点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
}
Run Code Online (Sandbox Code Playgroud)

例子


Hit*_*bat 5

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

https://godbolt.org/z/P7Ugkt