【问题标题】:How to return more than one value from a C++ function?如何从 C++ 函数返回多个值?
【发布时间】:2011-09-07 10:29:30
【问题描述】:

如果我可以从一个函数返回多个值,我很感兴趣。例如考虑这样一个函数:扩展欧几里得算法。基本步骤是这样描述的 输入是非负整数 a 和 b; 输出是一个三元组 (d,i,j),使得 d=gcd(a,b)=i*a+j*b。 为了澄清我的问题的目标,我将编写一个简短的递归代码:

 if (b==0)  return (a,1,0)
      q=a mod b;

让 r 满足 a=r*b+q;

(d,k,l)=extendedeuclidean(b,q);
  return (d,l,k-l*r); 

如何返回一个三元组?

【问题讨论】:

  • 下次考虑使用标点符号。这很难阅读。

标签: c++ number-theory


【解决方案1】:

您可以从您的三元组中创建一个std::tupleboost::tuple(如果您不使用 C++0x)并将其返回。

【讨论】:

    【解决方案2】:

    根据 Tony The Tiger 的建议,您可以使用 tuple。它包含在 C++11 标准中,并且新的编译器已经支持它。它也在boost 中实现。 对于我的 ibm xlC 编译器元组在 std::tr1 命名空间中(在 MSVC10 中尝试过——它在 std 命名空间中)。

    #include <cstdio>
    #include <tuple>
    
    // for MSVC
    using namespace std;
    
    // for xlC 
    //using namespace std::tr1;
    
    // for boost
    // using namespace boost;
    
    typedef tuple<int, float, char> MyTuple;
    MyTuple f() {
        return MyTuple(1, 2.0f, '3');
    }
    
    int main() {
        MyTuple t = f();
        printf("%i, %f, %c\n", get<0>(t), get<1>(t), get<2>(t));
    }
    

    TR1 的 xlC 编译:

    xlC -D__IBMCPP_TR1__ file.cpp
    

    用于 boost 的 xlC 编译:

    xlC file.cpp -I/path/to/boost/root
    

    【讨论】:

      【解决方案3】:

      只需创建一个适当的数据结构来保存这三个值并返回它。

      struct extmod_t {
          int d;
          int i;
          int j
          extmod_t(int d, int i, int j) : d(d), i(i), j(j) { }
      };
      
      …
      
      extmod_t result = extendedeuclidean(b, q);
      return extmod_t(result.d, l, k - l * r);
      

      【讨论】:

      • 只有一个问题,当递归调用函数时怎么办?
      • @user466534 你什么意思?递归不需要特殊处理。
      【解决方案4】:

      要么创建一个封装三元组的类,然后返回这个类的实例,要么使用3个引用参数。

      【讨论】:

      • –1 用于引用参数。这是对参数的可怕滥用,完全没有必要,并且使函数使用起来不太方便。
      • @Konrad 只有在调用者已经准备好使用该对象的情况下才使用起来不太方便。如果其余代码使用独立字段,那么“解包”返回的对象实际上可能比直接通过引用传递字段更难看。
      【解决方案5】:

      我通常发现当我需要从一个函数中返回两个参数时,使用STLstd::pair很有用。

      您总是可以将这些对堆叠在一起(例如std::pair &lt;int, std::pair &lt;int, int&gt; &gt;)并使用 typedef-s 或定义来帮助您自己使其更易于访问,但是当我尝试这样做时,我的代码最终会变得混乱且不实用- 使用。

      但是,对于两个以上的参数,我建议您使用特定的数据结构来保存您需要的信息(如果您要返回多个值,那么它们很可能以某种方式在逻辑上紧密相连,并且您最终可能会使用同样的结构)。

      例如我需要一个函数来返回线的斜率(1 个参数),这很好。然后我需要扩展它以返回线的参数表示的两个参数(y = k*x + l)。两个参数,还是可以的。然后我记得这条线可以是垂直的,我应该添加另一个参数来表示(那时没有参数表示)......此时,尝试使用现有数据类型变得太复杂了,所以我输入了我的自己的 Line 结构,后来在我的项目中使用了相同的结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-04-29
        • 2021-12-21
        • 2021-11-27
        • 1970-01-01
        相关资源
        最近更新 更多