私はC ++でコーディングしています。関数がvoid foo(vector<int> test)
あり、それをプログラムで呼び出す場合、ベクトルは値または参照で渡されますか?ベクトルと配列が似ており、関数like void bar(int test[])
が値ではなく参照(ポインタ?)でテストに合格することを知っているので、確信が持てません。私の推測では、値による受け渡しを避けたい場合は、ポインター/参照によって明示的にベクトルを渡す必要がありますが、確信が持てません。
私はC ++でコーディングしています。関数がvoid foo(vector<int> test)
あり、それをプログラムで呼び出す場合、ベクトルは値または参照で渡されますか?ベクトルと配列が似ており、関数like void bar(int test[])
が値ではなく参照(ポインタ?)でテストに合格することを知っているので、確信が持てません。私の推測では、値による受け渡しを避けたい場合は、ポインター/参照によって明示的にベクトルを渡す必要がありますが、確信が持てません。
回答:
推測しなければならないのであれば、あなたはJavaの出身だと思います。これはC ++であり、特に&
-operator を使用して指定しない限り、値によって渡されます(この演算子は「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);
}
A vector
は配列と機能的に同じです。しかし、言語にvector
は型int
があり、型でもあります。関数の引数に対して、任意の型(を含むvector[]
)の配列はポインターとして扱われます。A vector<int>
はint[]
(コンパイラにとって)同じではありません。vector<int>
配列でも参照でもポインタでもない-値で渡されるため、copy-constructorを呼び出します。
そのため、参照として渡すにはvector<int>&
(const
関数で変更されていない場合は、を使用することが望ましい)を使用する必要があります。