簡體   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