亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于C ++ 11范圍的循環:按值獲取項目或引用const

基于C ++ 11范圍的循環:按值獲取項目或引用const

C++
慕萊塢森 2019-09-18 19:19:53
讀取基于范圍環的一些例子他們建議兩種主要方式1,2,3,4std::vector<MyClass> vec;for (auto &x : vec){  // x is a reference to an item of vec  // We can change vec's items by changing x }要么for (auto x : vec){  // Value of x is copied from an item of vec  // We can not change vec's items by changing x}好。當我們不需要更改vec項目時,IMO,示例建議使用第二個版本(按值)。為什么他們不建議const引用的東西(至少我沒有找到任何直接的建議):for (auto const &x : vec) // <-- see const keyword{  // x is a reference to an const item of vec  // We can not change vec's items by changing x }不是更好嗎?它是不是避免了每次迭代中的冗余副本,而它是一個const?
查看完整描述

3 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

如果您不想更改項目以及想要避免復制,那么這auto const &是正確的選擇:

for (auto const &x : vec)

建議你使用的人auto &是錯的。別管他們。

這是概述:

  • 選擇auto x何時使用副本。

  • 選擇auto &x何時使用原始項目并可以修改它們。

  • 選擇auto const &x何時使用原始項目,不會修改它們。


查看完整回答
反對 回復 2019-09-18
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

當我們不需要更改vec項目時,示例建議使用第一個版本。


然后他們給出了錯誤的建議。


為什么他們不建議const引用的東西


因為他們給出了錯誤的建議:-)你提到的是正確的。如果您只想觀察一個對象,則無需創建副本,也不需要對其進行非const引用。


編輯:


我看到你鏈接的引用都提供了迭代一系列int值或一些其他基本數據類型的示例。在這種情況下,由于復制int并不昂貴,因此創建副本基本上等同于(如果不是更有效)進行觀察const &。


但是,對于用戶定義的類型,通常不是這種情況。復制UDT可能很昂貴,如果您沒有理由創建副本(例如修改檢索到的對象而不更改原始副本),則最好使用a const &。


查看完整回答
反對 回復 2019-09-18
  • 3 回答
  • 0 關注
  • 539 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號