1. 程式人生 > >STL之容器作為形參的傳遞

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作為函式的引數時,引用傳遞和值傳遞的區別

值傳遞示意圖:


引用傳遞示意圖: