C++ でのベクトルコンテナオブジェクトのコピー

胡金庫 2023年10月12日
  1. C++ でイニシャライザリスト表記を使用してベクトルコンテナオブジェクトをコピーする
  2. C++ で std::copy アルゴリズムを使用してベクターコンテナオブジェクトをコピーする
  3. C++ で代入演算子のコピーを使用してベクトルコンテナオブジェクトをコピーする
  4. C++ でコピーコンストラクタを使用してベクターコンテナオブジェクトをコピーする
  5. C++ で assign メンバー関数を使用してベクターコンテナオブジェクトをコピーする
C++ でのベクトルコンテナオブジェクトのコピー

この記事では、C++ で std::vector コンテナオブジェクトをコピーする方法のいくつかの方法について説明します。

C++ でイニシャライザリスト表記を使用してベクトルコンテナオブジェクトをコピーする

std::vector は、STL コンテナライブラリで提供されるコアデータ構造です。動的にサイズ設定された配列要素を実装し、その要素は連続して格納されます。ユーザーが配列に要素を追加または削除すると、メモリ管理が自動的に実行されます。std::vector タイプの新しい変数を作成するときに、イニシャライザリスト表記を使用してベクトルオブジェクトのコピーを作成できます。新しいオブジェクトにコピーする必要がある元のベクトルオブジェクトの begin および end イテレータを渡す必要があることに注意してください。同じ表記法を使用して、対応するイテレータを中括弧内の引数として指定することにより、オブジェクトの任意のサブベクトルを抽出できます。

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c = {vec1.begin(), vec1.end()};
  vector<int> vec1_cc = {vec1.begin(), vec1.end() - 4};

  printVector(vec1_c);
  printVector(vec1_cc);

  return EXIT_SUCCESS;
}

出力:

23; 43; 324; 222; 649; 102; 40; 304;
23; 43; 324; 222;

C++ で std::copy アルゴリズムを使用してベクターコンテナオブジェクトをコピーする

std::vector オブジェクトをコピーする別の方法は、STL アルゴリズムライブラリから std::copy 関数を呼び出すことです。範囲ベースのオブジェクトの一般的なコピー操作を提供します。関数には複数のオーバーロードがありますが、次のコードスニペットで使用されているオーバーロードは 3つのイテレーター引数を取ります。最初の 2つは元のベクトル範囲を指定し、3 番目のイテレーターは宛先ベクトル範囲の開始を示します。

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c(vec1.size());
  copy(vec1.begin(), vec1.end(), vec1_c.begin());
  printVector(vec1_c);

  return EXIT_SUCCESS;
}

出力:

23; 43; 324; 222; 649; 102; 40; 304;

C++ で代入演算子のコピーを使用してベクトルコンテナオブジェクトをコピーする

または、コピー代入演算子を使用して、std::vector コンテナオブジェクトの内容をコピーすることもできます。この表記は、この問題の最も簡潔な解決策です。元のベクトルの変数を新しく宣言されたベクトルオブジェクトに割り当てる必要があります。

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c = vec1;
  printVector(vec1_c);

  return EXIT_SUCCESS;
}

出力:

23; 43; 324; 222; 649; 102; 40; 304;

C++ でコピーコンストラクタを使用してベクターコンテナオブジェクトをコピーする

一方、std::vector クラスのコピーコンストラクターは、新しく宣言されたベクターオブジェクトにベクターをコピーするための同様のメソッドを提供します。この場合、新しく作成されたベクトル変数が宣言されるときに、元のベクトルの変数を括弧内に渡す必要があります。

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c(vec1);
  printVector(vec1_c);

  return EXIT_SUCCESS;
}

出力:

23; 43; 324; 222; 649; 102; 40; 304;

C++ で assign メンバー関数を使用してベクターコンテナオブジェクトをコピーする

std::vector コンテナは、assign メンバー関数を提供します。この関数を使用して、あるベクトルオブジェクトのコンテンツを別のベクトルの要素に置き換えることができます。空の vector コンテナを初期化してから、オブジェクトから assign 関数を呼び出して、別のベクターの内容をコピーできることに注意してください。

#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {23, 43, 324, 222, 649, 102, 40, 304};

  vector<int> vec1_c;
  vec1_c.assign(vec1.begin(), vec1.end());
  printVector(vec1_c);

  return EXIT_SUCCESS;
}

出力:

23; 43; 324; 222; 649; 102; 40; 304;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Vector