私は C++ でコーディングしています。関数がありvoid foo(vector<int> test)
、それをプログラムで呼び出す場合、ベクトルは値で渡されるのでしょうか、それとも参照で渡されるのでしょうか。ベクトルと配列は似ていること、および次のような関数はvoid bar(int test[])
値ではなく参照 (ポインタ?) でテストを渡すことはわかっているので、確信はありません。値渡しを避けたい場合は、ベクトルをポインタ/参照で明示的に渡す必要があると思いますが、確信はありません。
ベストアンサー1
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)
)。ただし、何をしているのかを理解しており、これが本当に正しい方法であると感じない限り、これを行わないでください。
また、ベクトルはない配列と同じです。内部的には、ベクターはメモリ管理を処理する配列を追跡しますが、これは他の多くの STL コンテナーでも同様です。ポインターまたは配列を期待する関数にベクターを渡すことはできません (その逆も同様です) (ただし、基になる配列 (へのポインター) にアクセスして、これを使用することはできます)。ベクターはメンバー関数を通じて多くの機能を提供するクラスですが、ポインターと配列は組み込み型です。また、ベクターは動的に割り当てられます (つまり、サイズは実行時に決定および変更できます)。一方、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);
}