1. 程式人生 > >C++(筆記)容器(vector)作為函式引數如何傳參

C++(筆記)容器(vector)作為函式引數如何傳參

一、大致以下型別

  1. void 函式名( vector< int> obj );
  2. void 函式名( vector< int>* pobj );
  3. void 函式名( const vector< int>* pobj ); // 在函式內不能改變 pobj 指向的物件 ,//呼叫時不會呼叫拷貝建構函式
  4. void 函式名( vector< int>& obj );
  5. void 函式名( const vector< int>& obj ); // 在函式內不能改變 obj 物件,// 在函式呼叫時呼叫了vector的拷貝建構函式

分別對應

其對應的呼叫分別是:
1. deal( vec );
2. deal( &vec );
3. deal( &vec );
4. deal( vec );
5. deal( vec );

二、注意

如果需要在函式中對vector容器中資料調換順序等操作需要是引用傳遞

例如

這裡寫圖片描述

這樣如果不把obj地址放進去則會無法改變順序,這個C中的swap現象是一樣的

正確如下

這裡寫圖片描述

儘量都用引用傳遞

三、程式碼例項值傳遞問題

這裡寫圖片描述

//輸出:1 。//vector1是無法給容器obj1新增元素的,因為這裡採用的是值傳遞,形參的改變無法影響到實參obj1,而且實參給形參賦值的時候會呼叫vector的拷貝建構函式浪費資源。

這裡寫圖片描述


這裡寫圖片描述

//輸出:1,0,1,2,3,4,5,6,7,8,9, // vector2和vector3是可以給容器obj1新增元素的,他們分別採用的引用傳遞和指標傳遞,在函式內部形參發生改變時,這種改變可以直接“傳遞”給被呼叫的實參

四、函式實現初始化容器&輸出容器所有資料(使用迭代器)

/*初始化容器*/  
 void init_vector(vector <int> &obj){  
     for(int i=0;i<10;i++)  
         //push_back()方法在vector的末尾附加元素    
         obj.push_back(i);
}  
 /* 顯示容器中的所有資料*/  
 void show_vector(vector <int> &obj){  
     vector<int>::iterator it = obj.begin();  
     //使用迭代器//it 是一個地址  
     while(it<obj.end()){  
        cout<<*it<<endl;  
        it++;  
     }  
 }