1. ホーム
  2. c++

形式的なパラメータ渡しの問題としてのc++ベクトル

2022-02-22 20:07:09

最近、仕事でベクターコンテナを渡したいという問題に遭遇したので、いろいろ調べて自分でデバッグして理解しました

コード


コードの69行目でベクトルを定義し、コンテナinit_vector1, init_vector2, init_vector3を初期化する3つの関数を記述しています。

デバッグすることで、以下のことがわかります。

init_vector1 はコンテナ vec に要素を追加することができません。なぜなら、ここでは値渡しが使用されており、形式参照の変更は実際の vec に影響を与えることができず、実際の参照が形式参照に値を割り当てるときに vector のコピーコンストラクタが呼び出されてリソースを無駄にするからです。

init_vector2 と init_vector3 はコンテナ vec に要素を追加でき、それぞれ参照とポインタで渡されるため、内部の形式参照が変更されると、その変更は呼び出された実参照に直接 "passed" できる。

次に、イテレータパッシングを使用して、vec コンテナの要素を最大から最小にソートする関数である sort_vector4 を見てみましょう。これは、デバッグを通じて実際に期待通りに動作します(ここでも実際には参照渡しが使用できます)。

まとめると

コンテナの長さを変更したい場合(例えば、いくつかの要素を挿入したり削除したり)、参照またはポインタで渡します(参照は推奨されますが、ポインタは強力ですが危険でもあります)。

他の目的でコンテナを渡す必要がある場合 (上記のソートのように、ある値がコンテナ内にあるかどうかを確認するための比較を行う場合) は、イテレータパッシングを使用できます。


間違いがあれば指摘してほしい。