コピー・参照と関数の引数
大きなvectorを関数へ値渡しすると、その中身がコピーされます。読み取り専用の参照を使うと避けられます。
言語:C++ / 計算量:例の処理による
考え方
- vector<int> a は値渡し。
- const vector<int>& a は変更しない参照。
- 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":" ");}