如果我可以从函数返回多个值,我感兴趣。例如,考虑这样一个函数:扩展欧几里德算法。基本步骤由此描述
输入是非负整数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);
如何归还三胞胎?
答案 0 :(得分:8)
你可以从你的三对中创建一个std::tuple
或boost::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结构,最后在我的项目中使用相同的结构。