【问题标题】:Use of `std::make_pair` in std::pair : C++ STL在 std::pair 中使用`std::make_pair`:C++ STL
【发布时间】:2016-06-13 16:23:46
【问题描述】:

我多次注意到,每当需要为(新的)std::pair 赋值时,都会使用std::make_pair。但是我没有发现make_pair 函数有什么用处,因为我们可以直接将值输入到一对中,并根据需要进行修改。 例如:

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

那么这个函数到底有什么用呢?

【问题讨论】:

  • 现在尝试使用没有默认构造函数的类型。
  • @milleniumbug: 有效的观察,但std::make_pair 也有同样的问题。从根本上说,这是语言和库之间的设计问题。您根本无法编写由输入流按顺序初始化的对象声明的异构列表。你能得到的最接近的方法是定义带有流参数的 ctors,并在流上为内置类型定义转换操作。您仍然需要使用该样式多次重复流名称。

标签: c++ stl std-pair


【解决方案1】:

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

    有,它的优点叫Template argument deduction。它节省了一点打字,让您可以使用autoclass-template 参数必须明确指定,functions 不能。


    但是C++17 就变得多余了,因为我们将拥有Template Argument Deduction For class-templates

    【讨论】:

      【解决方案3】:

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

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

      我能想到的一些问题:

      1. 您并不总是准备好流对象。 std::cin 是一个非常特殊的情况,std::make_pair 是一个非常通用的函数。

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

      3. 常量正确性。你可能想要一对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);
      }
      

      【讨论】:

      • 是的,我现在明白了。它现在只在某些地方有用!
      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 2011-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多