【问题标题】:C++ PPP exercise about returning multiple values关于返回多个值的 C++ PPP 练习
【发布时间】:2025-11-23 01:30:02
【问题描述】:

编写一个函数,找出一个元素的最小和最大元素 向量参数,还计算平均值和中位数。不使用 全局变量。返回包含结果的结构或 通过引用参数将它们传回。两种方式中的哪一种 您更喜欢返回几个结果值,为什么?

所以这是我现在正在阅读的书中的一个练习。我所做的只是创建了一个类并返回了一个包含所有数据的对象,但是通过引用参数将结果传回究竟是什么意思?我的意思是我可以想到这样的事情:

void calculate(vector<double> vec, double &min, double&max, double &median, double &mean)
{
// here I kinda just do everything so find the min, max, etc and because all those are references
// their value automatically gets changed


}

然后在 main 我可以有类似的东西:

int main()
{
double min, max, median, mean;
vector<int> v= {values};
calculate(v, min, max , median, mean);

}

这就是他们的意思吗?

【问题讨论】:

  • 您已经通过引用参数将结果传回。这正是最小值、最大值、中值和平均值的含义。

标签: c++


【解决方案1】:

通过引用参数传回它们

void calculate(vector&lt;double&gt; vec, double &amp;min, double&amp;max, double &amp;median, double &amp;mean)

这就是他们的意思吗?

是的。但是,我们不会通过 C++ 中的引用参数传递返回值。

首先,由于 C++17 我们有NRVO,所以直接return 实际上并不复制/移动返回值,而是在原地初始化它。通过引用参数模拟这一点没有任何好处。

其次,此技术需要在传递对它的引用之前默认构造您的对象。但是,它可能会为默认构造做一些代价高昂的事情(即使它通常不会),因此您甚至会因为这种“优化”而失去性能。

最后,对象的类型可能不允许默认构造:在 C++ 中,您通常要么put an object in a valid state or throw 异常,因此您在词法上不能使用无效对象。然后,如果成功构造需要参数,则不能默认构造。 Example.

所以,你的真实代码应该是这样的

struct Results { double min, max, median, mean; };
Results calculate(vector<double> const& vec); // you probably don't need to copy the vector

实际上我们并没有硬编码参数,甚至将vector&lt;double&gt; const&amp; vec 更改为auto&amp;&amp; range,但这是另一个话题。

【讨论】:

    【解决方案2】:

    这并不是他们想要的。 让我们看看。

    “编写一个函数,找出向量参数的最小和最大元素,并计算均值和中位数” 这个就在这里,非常清楚。这是你需要做的计算。

    “不要使用全局变量。要么返回一个包含结果的结构体,要么通过引用参数将它们传回。”

    有一种著名的方法可以从函数返回多个值。你可能会想,“好吧,让我们返回一个具有多个值的向量”,但这不是你必须做的,而且你不能在 c++ 中使用向量来做到这一点,你可以使用联合和枚举来做到这一点。 您可以通过引用传递。

    让我用一个例子来解释。 如果你有这个功能: 这是一个计算变量和和乘积的函数。如您所见,此功能“返回”到值。这些值通过引用传递。

    void calculate_something(int n,int m, int &sum, int  &product){
        sum = n+m; 
        product = n*m; 
    }
    
    int main(){
        int sum = 0; 
        int product = 1; 
        calculate_something(5,8,sum,product)
        cout<< sum <<endl; 
        cout<<product<<endl; 
    }
    
    

    【讨论】:

    • ...?你看过我的帖子吗...?这正是我展示的内容,我只是问我是否正确..?