形式的なパラメータ渡しの問題としてのc++ベクトル
最近、仕事でベクターコンテナを渡したいという問題に遭遇したので、いろいろ調べて自分でデバッグして理解しました
コード
コードの69行目でベクトルを定義し、コンテナinit_vector1, init_vector2, init_vector3を初期化する3つの関数を記述しています。
デバッグすることで、以下のことがわかります。
init_vector1 はコンテナ vec に要素を追加することができません。なぜなら、ここでは値渡しが使用されており、形式参照の変更は実際の vec に影響を与えることができず、実際の参照が形式参照に値を割り当てるときに vector のコピーコンストラクタが呼び出されてリソースを無駄にするからです。
init_vector2 と init_vector3 はコンテナ vec に要素を追加でき、それぞれ参照とポインタで渡されるため、内部の形式参照が変更されると、その変更は呼び出された実参照に直接 "passed" できる。
次に、イテレータパッシングを使用して、vec コンテナの要素を最大から最小にソートする関数である sort_vector4 を見てみましょう。これは、デバッグを通じて実際に期待通りに動作します(ここでも実際には参照渡しが使用できます)。
まとめると
コンテナの長さを変更したい場合(例えば、いくつかの要素を挿入したり削除したり)、参照またはポインタで渡します(参照は推奨されますが、ポインタは強力ですが危険でもあります)。
他の目的でコンテナを渡す必要がある場合 (上記のソートのように、ある値がコンテナ内にあるかどうかを確認するための比較を行う場合) は、イテレータパッシングを使用できます。
間違いがあれば指摘してほしい。
関連
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】 c++ "Incomplete type not allowed" クラス参照情報へのアクセスエラー (前方宣言による循環依存性)
-
[解決済み] CRT_SECURE_NO_WARNINGSの使用方法
-
[解決済み] "関数エラーとして使用できない"
-
[解決済み] c++で、関数名の前のチルダ"~"は何を意味するのですか?
-
[解決済み] c++でデストラクタへの未定義参照エラー?
-
[解決済み] C++でistreamから改行まで読み込む(ただし空白は不可)
-
[解決済み] C++ コンソール Application1.exe がブレークポイントをトリガーしました。
-
[解決済み] C++で文字列をchar配列に変換する方法は?
-
undefinedc++ と握手: define マクロ定義が、' ' の前にある期待される一次式に合致している。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] c++の多重定義エラーとその解決方法
-
[解決済み] ポインターのベクトルを消去する [重複] 。
-
[解決済み] c++のiostreamヘッダーのcout, cerr, clogの違いは何ですか?いつ、どれを使うのですか?
-
[解決済み] モジュール unsafe for SAFESEH image C++
-
[解決済み] C++のユーザー入力待ち [重複]。
-
[解決済み] 無効なNullポインタ - C++
-
[解決済み] gdb: (デバッグシンボルが見つかりませんでした)
-
[解決済み] エラー LNK2019: 関数内で参照されている未解決の外部シンボル "" があります。
-
[解決済み] コンパイルエラー - 配列の添え字の型が 'char[int]' でない。