Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实现[B,C]=f(A)语法(函数f作用于具有两个或多个输出数组的数组)_C++_Arrays_Function - Fatal编程技术网

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 > STD::配对和 STD::MaMuxOb/<代码>对于这个特定的情况(只有两个输出).

一般来说,如果您想返回多个值,则必须做一些小的工作,因为C++不允许这个。 第一个选项是返回一个包含这两个值的值。如果有可用的C++11,则可以在return语句中使用,如下所示:

std::tie(B, C) = f(A);
f(A, &B, &C);
(注意:C++11还有两个以上的值。)

或者,您可以通过引用传递两个目标变量,但是函数调用会变成这样(在没有C++11的情况下工作):

为了使函数调用看起来更“详细”(有些人不喜欢这样,从这一行代码中看不出
f
changes
B
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元素元组。不过,它们可能是可兑换的。