从函数返回值:reference vs struct

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来解决这个问题?如何从函数中返回多个值?

das*_*ght 5

使用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)