コピー・参照と関数の引数

大きなvectorを関数へ値渡しすると、その中身がコピーされます。読み取り専用の参照を使うと避けられます。

言語:C++ / 計算量:例の処理による

前提:dict・set・heapの対応

考え方

  1. vector<int> a は値渡し。
  2. const vector<int>& a は変更しない参照。
  3. vector<int>& a は呼び出し元も変更する参照。

具体例

sum(const vector<int>& a) は配列全体のコピーを作りません。const が誤った書き換えを防ぎます。

実装

#include <iostream>
#include <vector>
using namespace std;
long long sum(const vector<int>& a){long long s=0;for(int x:a)s+=x;return s;}
int main(){vector<int>a={1,2,3};cout<<sum(a)<<"\n";}

注意する条件

関数内のローカル変数への参照を返すと寿命切れになります。vector拡張時の参照・イテレータ無効化にも注意。

確認問題

const vector<int>& は配列全体をコピーする? Yes/No

解答と理由

No

既存のvectorを参照します。呼び出し先ではconstにより変更できません。

実装課題

vectorの全要素を1増やす関数 inc を参照渡しで作り、{1,2,3} に適用して出力。

出力:
2 3 4
参考実装
#include <iostream>
#include <vector>
using namespace std;
void inc(vector<int>&a){for(auto&x:a)x++;}
int main(){vector<int>a={1,2,3};inc(a);for(int i=0;i<3;i++)cout<<a[i]<<(i==2?"\n":" ");}

読了の記録・下書き・メモへ

関連する公式資料・課題