C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】コンストラクターにvector(ベクトル)を渡す方法をわかりやすく解説

C++では、std::vectorをクラスのコンストラクターに渡すことで、オブジェクト生成時にまとめてデータを初期化できます。この記事では、ベクトルをコンストラクターに渡すシンプルなC++プログラムを、アルゴリズム・サンプルコード・実行結果とともに紹介します。

アルゴリズム

処理の流れは以下の通りです。

開始
  Vectorという名前のクラスを宣言する
    vector<int>型のメンバー変数vecを宣言する
    Vectorクラスのコンストラクターを宣言する
      ベクトルオブジェクトvを引数として受け取る
      vec = v として初期化する
    ベクトルの値を表示するshow()関数を宣言する
      for (int i = 0; i < vec.size(); i++)
        vec[i] のすべての値を出力する
  main関数内でvector型のvを宣言する
    配列形式でvに初期値を設定する
  Vectorクラスのオブジェクトobを宣言し、vを渡す
  ob.show() を呼び出してベクトルvのすべての値を表示する
終了

サンプルコード

実際のコードは次のようになります。

#include <iostream>
#include <vector>
using namespace std;

class Vector {
    vector<int> vec;
public:
    // コンストラクター:ベクトルを受け取ってコピーする
    Vector(vector<int> v) {
        vec = v;
    }
    void show() {
        for (int i = 0; i < vec.size(); i++)
            cout << vec[i] << " ";
    }
};

int main() {
    vector<int> v = {7,6,5,4};
    Vector ob(v);   // コンストラクターにベクトルを渡す
    ob.show();
    return 0;
}

実行結果

7 6 5 4

コードの解説

このプログラムのポイントは以下の通りです。

  • メンバー変数の宣言: クラス内に vector<int> 型の変数 vec を用意し、渡されたデータを保持できるようにしています。
  • コンストラクターでの受け取り: コンストラクター Vector(vector<int> v) が引数としてベクトルを受け取り、vec = v; によって内容をコピーします。
  • 表示用メソッド: show() 関数が for ループで要素を順番に出力します。vec.size() で要素数を取得しているため、どんなサイズのベクトルにも対応できます。

補足:const参照渡しで効率アップ

上記の例では引数を値渡しにしているため、ベクトル全体のコピーが発生します。要素数が多い場合は、const参照を使うと不要なコピーを避けられます。

Vector(const vector<int>& v) {
    vec = v;
}

このように書き換えても動作は同じですが、大きなデータを扱う際にはパフォーマンス面で有利です。状況に応じて使い分けるとよいでしょう。

  1. C++のポインタ渡しと参照渡しの違いをサンプルコードで解説

    C++では、関数に引数を渡す方法として「ポインタ渡し」と「参照渡し」の2つがよく使われます。どちらも呼び出し元の変数そのものを操作できるため、値渡しとは異なり、関数内での変更が呼び出し元にも反映されます。ここでは、2つの変数の値を入れ替えるswap関数を例に、それぞれの書き方と動作を見ていきましょう。 ポインタ渡し(pass by pointer) ポインタ渡しでは、変数のアドレスを関数に渡します。関数側ではポインタを受け取り、間接演算子(*)を使ってアドレスが指す先の値にアクセスします。 #include <iostream> using namespace std; void

  2. C++のコピーコンストラクタとは?仕組みと実装方法をサンプルコード付きで解説

    コピーコンストラクタは、コンストラクタの一種です。同じクラスのオブジェクトを受け取り、その値を使って新しいオブジェクトを生成・初期化します。もしクラス内でコピーコンストラクタが定義されていない場合、コンパイラが自動的にデフォルトのコピーコンストラクタを生成します。ただし、ポインタ変数や動的メモリ確保(new/delete)を持つクラスでは、デフォルトのコピーは浅いコピー(shallow copy)となり、同じメモリ領域を複数のオブジェクトが参照してしまう問題が発生します。そのため、このようなクラスでは独自のコピーコンストラクタを定義することが必須となります。コピーコンストラクタのサンプルプログ