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

问题描述 投票:0回答:3

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

v.push_back({x, y});

并且:

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

假设v以这种方式声明:

vector<pair<int,int> > v;
c++ std-pair
3个回答
1
投票

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

https://godbolt.org/z/P7Ugkt


6
投票

我想你可能已经接受了这个答案有点太快了。通常可以这样做的方法是这样的:

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 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

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


1
投票

{x, y}中的v.push_back({x, y})aggregate initialization (since C++11)vvalue_type,而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
}

Example

© www.soinside.com 2019 - 2024. All rights reserved.