C++ 实现[B,C]=f(A)语法(函数f作用于具有两个或多个输出数组的数组)
我有一个问题是我最近发布的另外两个问题的延伸: 及 假设我有一个数组C++ 实现[B,C]=f(A)语法(函数f作用于具有两个或多个输出数组的数组),c++,arrays,function,C++,Arrays,Function,我有一个问题是我最近发布的另外两个问题的延伸: 及 假设我有一个数组A。我想创建一个作用于a并返回另外两个数组B和C的函数f,方法是启用以下类似Matlab的语法 [B,C]=f(A); < C++ > 是可能的吗? 根据LEEMES的回答解决方案 #include <tuple> using std::tie; std::tuple<TypeOfB,TypeOfC> f(const Matrix<T1>&a,const Matrix<T
A
。我想创建一个作用于a
并返回另外两个数组B
和C
的函数f
,方法是启用以下类似Matlab的语法
[B,C]=f(A);
< C++ > 是可能的吗?
根据LEEMES的回答解决方案
#include <tuple>
using std::tie;
std::tuple<TypeOfB,TypeOfC> f(const Matrix<T1>&a,const Matrix<T2>&a) {
// Instruction declaring and defining B_temp and C_temp
return std::make_tuple(B_temp,C_temp); }
int main( int argc, char** argv)
{
// Instruction declaring A, B and C
tie(B,C)=f(A);
// STUFF
return 0;
}
#包括
使用std::tie;
标准::元组f(常数矩阵和a,常数矩阵和a){
//声明和定义B_temp和C_temp的指令
return std::make_tuple(B_temp,C_temp);}
int main(int argc,字符**argv)
{
//声明A、B和C的指令
领带(B,C)=f(A);
//东西
返回0;
}
在更改<代码> STD::tuple < /C> >和>代码> MaxuPuple >
一般来说,如果您想返回多个值,则必须做一些小的工作,因为C++不允许这个。 第一个选项是返回一个包含这两个值的值。如果有可用的C++11,则可以在return语句中使用,如下所示:
std::tie(B, C) = f(A);
f(A, &B, &C);
(注意:C++11还有两个以上的值。)
或者,您可以通过引用传递两个目标变量,但是函数调用会变成这样(在没有C++11的情况下工作):
为了使函数调用看起来更“详细”(有些人不喜欢这样,从这一行代码中看不出f
changesB
和C
),您还可以使用指针而不是引用。然后函数调用将如下所示:
std::tie(B, C) = f(A);
f(A, &B, &C);
另一种选择是对多个返回值使用一个简单的“容器”。如果一个简单的对或元组没有赋予值特定的含义,这尤其有用。最好的选择是在调用f
(不要使用单独的数组B
和C
)的代码中一致地使用它。只有当它与代码设计的其余部分非常吻合时,才使用它
struct TwoArrays {
int B[100];
int C[100];
};
TwoArrays result = f(A);
在C++中,这种操作将使用容器完成。f(x)将返回一个声明包含两个数组的容器引用。但是,由于这是C++,所以应该使用容器代替数组本身。请注意,原始数组只在某些情况下使用。尝试使用更高级别的容器,例如
std::vector
(动态大小)或std::array
(自C++11以来的常量大小)。@leems我正在使用自己的数组类,因为我正在处理模板元编程以提高效率。@JackOLantern:std::array
的作者可能会使用您可能不会使用的技巧,因为std::array
是实现的一部分。因此,不要认为你的版本更有效,即使它是你能做的最好的版本。非常感谢你的回答。您使用pair(tuple)/tie和容器的解决方案非常有前景。我不喜欢f(A,B,C)代码>语法,因为它与Matlab提供的非常不同。从你的回答中,我知道我的问题的答案是否定的:我永远不会得到Matlab的语法[B,C]=f(A)代码>。然而,我可以实现result=f(A)然后使用std::tie(B,C)=结果代码>或B=结果B代码>和C=result.C代码>。在第一种情况下,我可以直接使用std::tie(B,C)=f(A)代码>。我说得对吗?谢谢。但是在pair(tuple)/tie
的情况下,我可以使用一些技巧来掩盖std::tie(B,C)
语法,最终得到类似(B,C)=f(A)代码>?再次感谢。如果您返回一对,请在同一语句中使用tie(就像您的上一个代码片段)。如果返回自定义结构,请在下一条语句中像result.B
那样访问它。是的,tie的设计目的是使它看起来几乎像“返回多个值”的东西,只是在括号前加上了额外的“std::tie”。如果使用std::tie添加
(建议在includes之后)您只需编写tie(B,C)=f(A)
,这更像您所要求的语法。我甚至喜欢语法中的最后一点冗长。我不确定tie是否适用于pair。如果有问题,请尝试使用2元素元组。不过,它们可能是可兑换的。