pie*_*lli 3 c++ struct return-value parameter-passing
我是编程新手,我正在使用这本书学习C++编程语言:使用C++编程原理和实践.我今天在这里,因为在第8章末尾,作者关注功能并提出一个练习,邀请学习者思考问题的更好解决方案:
编写一个函数,查找向量参数的最小和最大元素,并计算均值和中位数.不要使用全局变量.返回
struct包含结果的a或通过引用参数传回它们.您更喜欢哪两个返回多个值?为什么?
现在,通常我不会定义单个函数来执行多个操作,但在这种情况下,我必须只创建一个函数并考虑如何返回多个值.我的第一个方法是创建一个带有这样的引用参数的函数:
void my_func(
vector<double>& numbers,
double& min,
double& max,
double& mean,
double& median
);
Run Code Online (Sandbox Code Playgroud)
但继续编写程序我开始认为这个解决方案使用了太多的参数,也许提出的其他解决方案(使用struct)会更好.你会如何用a 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;
}
Run Code Online (Sandbox Code Playgroud)
这里的权衡是,为了换取更简单的函数签名,函数的用户需要逐个提取他们想要的元素.
但是,如果结构非常复杂并且复制成本太昂贵呢?
与函数的"有效负载"CPU时间相比,复制时需要一个极大的结构才能变得过于昂贵.最重要的是,当您执行此操作时,C++优化器通过使用复制省略和返回值优化策略来降低复制成本:
stats s = my_func(numbers);
Run Code Online (Sandbox Code Playgroud)
当struct变得如此巨大以至于你不想复制它时,结合这两种方法:
void my_func(vector<double>& numbers, stats& res);
Run Code Online (Sandbox Code Playgroud)