繁体   English   中英

从函数返回值:reference vs struct

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM