簡體   English   中英

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

[英]Use of `std::make_pair` in std::pair : C++ STL

我注意到很多次,只要需要為(新) std::pair賦值,就會使用std::make_pair 但是我沒有找到make_pair函數的任何用法,因為我們可以直接將值輸入到一對,並根據需要修改它們。 例如:

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

那究竟是什么功能的使用?

有,它的優點是模板參數推導 它節省了一些打字,讓你使用auto 必須明確指定類模板參數, 函數必須不能。


但它在C ++ 17中變得多余,因為我們將為類模板提供模板參數演繹

std::make_pair用於創建具有指定值的std::pair對象。

創建一個std :: pair對象,從參數類型中推導出目標類型。

作為支持自動模板參數類型推導的模板函數,它允許您省略指定目標模板參數類型。 例如,

auto p1 = std::make_pair(1, 2);  // p1 is std::pair<int, int> with value {1, 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對。

讓我們把這三件事放在一起創建一個非編譯示例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM