1

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

如何返回三胞胎?

4

5 回答 5

8

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

于 2011-09-07T10:32:22.607 回答
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

用于增强的 xlC 编译:

xlC file.cpp -I/path/to/boost/root
于 2011-09-07T11:38:52.623 回答
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);
于 2011-09-07T10:32:10.773 回答
0

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

于 2011-09-07T10:33:09.847 回答
0

我通常发现当我需要从一个函数返回两个参数时,使用STL std::pair.

您总是可以将这些对相互堆叠(例如std::pair <int, std::pair <int, int> >)并使用 typedef-s 或定义帮助您自己使其更易于访问,但是当我尝试这样做时,我的代码最终会变得混乱且不切实际,无法重复使用。

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

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

于 2011-09-07T10:43:28.360 回答