1. ホーム
  2. c++

[解決済み] C++でベクターは値で関数に渡されるのか、それとも参照で渡されるのか

2022-03-16 13:52:56

質問

C++でコーディングしています。もし私がある関数 void foo(vector<int> test) をプログラム内で呼び出した場合、ベクターは値で渡されるのでしょうか、それとも参照で渡されるのでしょうか?ベクトルと配列が似ていることと、以下のような関数があることは知っているので、迷っています。 void bar(int test[]) は、値ではなく、参照(ポインタ?)でテストを渡すことになります。私の推測では、値で渡すのを避けたいなら、明示的にポインタ/参照でベクトルを渡す必要があると思うのですが、よくわかりません。

どのように解決するのですか?

C++では & -演算子(この演算子は「address-of」演算子としても使われますが、別の文脈で使われることに注意してください)。これはすべてよく知られていることだが、とにかくもう一度言っておこう。

void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo)
void foo(vector<int> const &bar); // by const-reference

また、ベクターへのポインターを渡すことも可能です ( void foo(vector<int> *bar) しかし、自分が何をしているのか分かっていて、これが本当に正しい方法だと思うのでなければ、この方法は使わないでください。

また、ベクターは ではない は、配列と同じです! 内部的には、vectorは配列を追跡し、その配列があなたのためにメモリ管理を行うのですが、他の多くのSTLコンテナも同じです。ポインタや配列を期待する関数に vector を渡すことはできませんし、その逆もできません(基礎となる配列へのアクセス(ポインタ)を取得してこれを使用することはできますが)。ポインタや配列が組み込み型であるのに対し、ベクターはメンバー関数を通じて多くの機能を提供するクラスです。また、ベクトルは動的に割り当てられる(つまり、実行時にサイズを決定し変更できる)のに対し、C言語の配列は静的に割り当てられる(サイズは一定で、コンパイル時に知る必要がある)ため、用途が限定されます。

C++全般についてもう少し読んでみることをお勧めします(具体的には 配列崩壊 そして、配列とポインタの違いを説明する次のプログラムを見てください。

void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }

int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    foo1(arr);
    foo2(arr);
    foo3(arr);
    foo4(arr);
}