STL之容器作為形參的傳遞
眼高手低,一看就會,一寫就錯,剛剛想起來用容器,結果連怎麼傳引數都忘了。
參考: http://blog.csdn.net/yishaxiaoyao/article/details/44344097
STL中的容器是個神器,第一次接觸時,甚是感到C語言好坑,毫無留念的投入到STL。
自己的理解:
vect可以理解為陣列,這個陣列比較特殊,不用考慮長度,溢位等問題,系統都給我們做好。
vect作為引數傳遞時,和普通型別變數作為引數傳遞本質上是相似的,一般有兩種方式。一種是值傳遞,一種是引用傳遞。
為什麼要有兩種方式? 因為每種方式各有優缺點,適用範圍不同。
兩種方式區別?
從書寫角度看: 傳值方式是 變數型別+變數名 如下述的void function(vector<int> a)
引用方式是 變數型別+&+變數名 如下述的void function(vector<int> & a)
從內部實現角度看: 值傳遞方式需要重新複製一段新的記憶體空間 ,對這段新的記憶體空間進行操作,並不影響原記憶體空間
引用傳遞方式則是對原記憶體空間增加一個新的別名(相當於多起個綽號),還是在原記憶體空間進行操作
從適用範圍看: 值傳遞一般是需要進行操作的記憶體空間較小
引用傳遞一般應用在,需要進行操作的記憶體空間很大,如果複製一個新的空間效率不高,使用引用方式,直接進行操作
個人愚見,未能全面,歡迎拍磚,共同學習。下面是參閱一些其他博主的舉例和分析,感覺講的很好,如有侵權,請聯絡刪除。
1、STL容器類自帶的拷貝建構函式和符號“=”對容器進行深拷貝
常見的STL容器包括:vector,deque,list,set,multiset,map,multimap,stack,queue,priority_queue。
將STL容器當作引數傳遞給函式時,如果是值傳遞,則會自動呼叫STL容器的拷貝建構函式,如下面的程式片段。
vector<int> a;
...
void function(vector<int> a) {
//a的作用域僅僅是函式範圍
//使用深拷貝在記憶體中重新分配了空間
//在這裡改變a的值不影響function外a的值
...
}
//即使function中改了a的值,此處a沒有任何變化
vector的拷貝建構函式會根據傳進來的vector開闢相同的空間,然後將傳進來的vector的元素一個一個拷貝到新的vector中。在逐個拷貝元素的過程中,如果該元素不是int型,而是一個自定義的類,那麼必須使用該自定義的類的拷貝建構函式。那麼,此時是否為深拷貝,取決於該自定義的類是否重寫了拷貝建構函式。(關於STL容器內元素的拷貝問題,見引用1)
除了STL容器外,string類自帶的拷貝建構函式也是深拷貝。
使用上述的容器或者string作為函式的引數時,引用傳遞和值傳遞的區別
值傳遞示意圖:
引用傳遞示意圖: