[英]Returning values from a function : reference vs struct
我是编程新手,我正在使用这本书学习C ++编程语言:使用C ++编程原理和实践。 我今天在这里,因为在第8章末尾,作者关注功能并提出一个练习,邀请学习者思考问题的更好解决方案:
编写一个函数,查找向量参数的最小和最大元素,并计算均值和中位数。 不要使用全局变量。 返回包含结果的
struct
或通过引用参数传回它们。 您更喜欢哪两个返回多个值?为什么?
现在,通常我不会定义单个函数来执行多个操作,但在这种情况下,我必须只创建一个函数并考虑如何返回多个值。 我的第一个方法是创建一个带有这样的引用参数的函数:
void my_func(
vector<double>& numbers,
double& min,
double& max,
double& mean,
double& median
);
但继续编写程序我开始认为这个解决方案使用了太多的参数,也许提出的其他解决方案(使用struct
)会更好。 你会如何使用struct
来解决这个问题? 如何从函数中返回多个值?
使用struct
来解决这个问题很简单:为返回类型定义一个struct
,并使用它,如下所示:
struct stats {
double min;
double max;
double mean;
double median;
};
stats my_func(vector<double>& numbers) {
stats res;
...
res.min = ...
res.max = ...
res.mean = ...
res.median = ...
return res;
}
这里的权衡是,为了换取更简单的函数签名,函数的用户需要逐个提取他们想要的元素。
但是,如果结构非常复杂并且复制成本太昂贵呢?
与函数的“有效负载”CPU时间相比,复制时需要一个极大的结构才能变得过于昂贵。 最重要的是,当您执行此操作时,C ++优化器通过使用复制省略和返回值优化策略来降低复制成本:
stats s = my_func(numbers);
当struct
变得如此巨大以至于你不想复制它时,将这两种方法结合起来:
void my_func(vector<double>& numbers, stats& res);
声明struct
即
struct stats {
double min;
double max;
double mean;
double median;
};
然后
stats my_func(vector<double>& numbers);
功能将是这样的
stats my_func(vector<double>& numbers) {
stats return_value;
// Fill in the structure
return return_value;
}
那么你只需返回一个结构。
struct res {
double min;
double max;
double mean;
double median;
};
res my_func(vector<double>& numbers) {
res result;
// do stuff, put result in in result.min etc
return result;
}
另一种可以以类似的方式完成:
void my_func(vector<double>& numbers,
res& result)
{
// the same code except no return value
return;
}
现在针对您的任务中的问题(我不会回答 - 因为这是您更喜欢的问题)我想提一下技术差异是什么。
当返回一个结构就意味着你可能会创建的临时副本result
结构(这也可能会导致两个对象res
一个呼叫者和一个用于my_func
与工作)。 而另一种方法意味着您传递给函数本质上解决了放置结果的位置。 使用“良好”实现,您可能会得到相同的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.