如何从C ++函数返回多个值?

时间:2011-09-07 10:29:30

标签: c++ number-theory

如果我可以从函数返回多个值,我感兴趣。例如,考虑这样一个函数:扩展欧几里德算法。基本步骤由此描述 输入是非负整数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); 

如何归还三胞胎?

5 个答案:

答案 0 :(得分:8)

你可以从你的三对中创建一个std::tupleboost::tuple(如果你不使用C ++ 0x)并返回它。

答案 1 :(得分:2)

正如Tony The Tiger所建议的,你可以使用tuple。它包含在C ++ 11标准中,新的编译器已经支持它。它也在boost中实现。 对于我的ibm xlC编译器,tuple位于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

升级的xlC编译:

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

答案 2 :(得分:0)

只需创建一个包含三个值的适当数据结构并返回该值。

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

答案 3 :(得分:0)

创建一个封装三元组的类,然后返回该类的实例,或者使用3个by-reference参数。

答案 4 :(得分:0)

我经常发现,当我需要从函数返回两个参数时,使用STL std::pair非常有用。

你总是可以将这些对堆叠在一起(例如std::pair <int, std::pair <int, int> >)并用typedef-s帮助你自己或定义使它更容易访问,但是当我尝试这样做时,我的代码最终会变得混乱和不实用重复使用。

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

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