在std :: pair中使用`std :: make_pair`:C ++ STL

时间:2016-03-01 09:56:21

标签: c++ stl std-pair

我注意到很多次,只要需要为(新)std::pair分配值,就会使用std::make_pair。但我没有找到make_pair函数的任何用法,因为我们可以直接将值输入到一对,并根据需要修改它们。 例如:

std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;

那究竟是什么功能使用?

3 个答案:

答案 0 :(得分:5)

有,其优势称为Template argument deduction。它可以节省一些输入,并允许您使用auto。必须明确指定 class-template 参数, functions ,不得。

C++17会变得多余,因为我们会Template Argument Deduction For class-templates

答案 1 :(得分:5)

std::make_pair用于创建具有指定值的std::pair对象。

  

创建一个std :: pair对象,从参数类型中推导出目标类型。

作为支持自动模板参数类型推导的模板函数,它允许您省略指定目标模板参数类型。如,

auto p1 = std::make_pair(1, 2);  // p1 is std::pair<int, int> with value {1, 2}

答案 2 :(得分:2)

  

我们可以直接将值输入到一对,并根据需要修改它们。   例如:

std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;

我能想到的一些问题:

  1. 您并不总是准备好流对象。 std::cin是一个非常特殊的案例,std::make_pair是一个非常泛型函数。

  2. 谁说这对中的两种类型都支持operator>>

  3. Const正确性。您可能希望拥有const对。

  4. 让我们把这三件事放在一起创建一个非编译示例:

    #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);
    }