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