[解決済み] C++でベクターは値で関数に渡されるのか、それとも参照で渡されるのか
質問
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);
}
関連
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] 配列を値でコピーする
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] 配列からポインタへの減衰とは何ですか?