範圍for語句裡為什麼要用引用?

時間 2021-05-08 21:33:59

1樓:Jude Gao

問:既然如此為什麼在範圍迴圈語句中要用引用呢?其意義是什麼?

答:用range-for遍歷的時候,你遍歷的是元素的拷貝。每次拷貝都需要呼叫該元素型別的copy constructor。

由於通常的use case中,我們不會對遍歷的元素進行更改,也就意味著copy-by-value的特性在浪費時間。往往,我們可以加&直接遍歷元素本身,而非拷貝。

問:引用是物件的乙個別名,每個引用會繫結乙個物件(非常量)既然我可以直接用本名,為什麼還要搞多一步用別名,後者不是一種間接使用?不會更低效嗎?

2樓:遛個彎兒

首先要肯定一下參考的例子是沒有問題的!這種情況下引用的效率也會更高,只是效果不明顯。

你執行結果的效果相同,只是顯示的效果一樣,但是程式執行的過程卻有很大的差別。

for(

autoc:

test_string

)cout

<

;// 每次迴圈程式的處理過程簡化

1.構造變數

charc2.

給變數c賦值

3.輸出變數c4.

析構變數

cfor

(auto&c

:test_string

)cout

<

;// 每次迴圈程式的處理過程簡化

1.給引用

c分配空間

,儲存引用的位置。

2.輸出變數

c可以看到,在引用的例子中,變數c是不需要構造乙個臨時變數型別的。如果test_string是乙個復合型別,例如:vector test_string;

class

myString

那麼每一次迴圈都要重新構造和析構一次myString,這時候使用引用&就可以避免無意義的構造和析構了。

3樓:netcan

你說的對一半,對於 string 這種資料結構來說,其由基本資料結構char組成,對於基礎資料結構來說,for應該用非引用,避免間接取址。

也就是說 for (auto c : test_string) cout << c << endl; 比引用要有效。

那什麼時候用引用呢?就是非基礎資料結構的時候,例如大型結構體 sizeof(STRUCT) > sizeof(size_t),那時候用引用比值有效,避免拷貝,拷貝是有開銷的。

在不改變元素的情況下,最終效果是一樣的,只不過哪種寫法更高效罷了;否則通過引用來改寫元素而不是拷貝。

4樓:逾幻月日

你這只實現單獨輸出當然是一樣的,並且不用引用完全可以。

但是問題在於,你看一下上下文,可能還會講到改變變數的值所以如果要改變變數值的時候,如果不用這個引用,那麼就會變成後面的資料元素中的乙份副本,從而不能改變實際的值了。

所以從普適性減少錯誤的角度來說,都用一下引用比較好,畢竟對於效能的開銷微乎其微,乙個O(1)的語句幾乎沒有影響

sql語句中啥什麼要用到group by?group by什麼根據什麼分組的?

小跑的人 在MYSQL中使用GROUP BY對錶中的資料進行分組時,GROUP BY X意思是將所有具有相同X字段值的記錄放到乙個分組裡,GROUP BY X,Y意思是將所有具有相同X字段值和Y字段值的記錄放到乙個分組裡。X,Y的排列組合 chengzhang GROUP BY 語句根據乙個或多個欄...

為什麼c 裡返回引用是危險的,但msdn還是寫了這樣的用法?

小島上的做題家 你的程式UML畫下來應該是一棵樹或者幾棵樹。構建時是從下往上構建,釋放時從上往下釋放。乙個object儲存的reference,其值一定要在這個架構中比這個object靠下,才是安全的,因為它的life time比你這個object長。本質上,你只要定義明白這個ref比它的使用者活得...

stl裡為什麼要用size type,而不直接用unsigned int 他們兩者其實是一回事吧

因為兩者不是一回事。拿 memcpy void dst,void const src,size t n 舉例,在乙個 I16P32 的機器上,處理器明明理論上最多可以複製 位元組,但如果引數 n 用 unsigned int 的話最大就只能複製 個位元組了。各個平台資料表示方式的記法 其中 I 指 ...