C++ でペアのベクトルに要素を追加

胡金庫 2023年10月12日
  1. push_backmake_pair を用いて対のベクトルに要素を追加する
  2. push_back とペアへのキャストを用いてペアのベクトルに要素を追加する
  3. ペアのベクトルに要素を追加するには emplace_back を使用する
C++ でペアのベクトルに要素を追加

この記事では、C++ でペアのベクトルに要素を追加するいくつかの方法を説明します。

push_backmake_pair を用いて対のベクトルに要素を追加する

コンテナ vectorstd::pair 型の要素を保持することができ、これは 2つの異種オブジェクト型を 1つのデータユニットとして保持するためのクラステンプレートです。これは、2つの要素しか保持できない点を除けば、Python などの異なるプログラミング言語でより一般的に知られている tuple データ型に似ています。

ペアのベクトルは vector<pair<int, string>> という式で宣言され、構造体と同じように初期化することができます。一旦 std::pair 型の要素を追加で vector にプッシュする必要があれば、push_back メソッドを利用することができます。ただし、このメソッドは make_pair 関数を用いて構築された要素を必要とすることに注意してください。

次の例では、 <int, string> ペアを使用し、ペアのベクトルに要素を追加する構文は push_back(make_pair(55, "fifty-five")) です。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::make_pair;
using std::pair;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> &vec) {
  for (auto i = 0; i < vec.size(); ++i) {
    cout << "(" << vec.at(i).first << "," << vec.at(i).second << ")"
         << "; ";
  }
  cout << endl;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "twelve"}, {32, "thirty-two"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVectorElements(vec1);

  vec1.push_back(make_pair(55, "fifty-five"));

  cout << "vec1: ";
  printVectorElements(vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

vec1: (12,twelve); (32,thirty-two); (43,forty-three);
vec1: (12,twelve); (32,thirty-two); (43,forty-three); (55,fifty-five);

push_back とペアへのキャストを用いてペアのベクトルに要素を追加する

前の方法の代替として、リテラル値をペアにキャストしてから push_back メソッドに式を挿入することができます。しかし、この方法は可読性の点ではあまり明確ではありませんし、大規模なコードベースではエラーが発生しやすいでしょう。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::make_pair;
using std::pair;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> &vec) {
  for (auto i = 0; i < vec.size(); ++i) {
    cout << "(" << vec.at(i).first << "," << vec.at(i).second << ")"
         << "; ";
  }
  cout << endl;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "twelve"}, {32, "thirty-two"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVectorElements(vec1);

  vec1.push_back(pair(55, "fifty-five"));

  cout << "vec1: ";
  printVectorElements(vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

vec1: (12,twelve); (32,thirty-two); (43,forty-three);
vec1: (12,twelve); (32,thirty-two); (43,forty-three); (55,fifty-five);

ペアのベクトルに要素を追加するには emplace_back を使用する

emplace_back メソッドは vector コンテナの組み込み関数であり、オブジェクトの末尾に新しい要素を作成します。emplace_back が動作するためには、要素型に args のコンストラクタを持たせなければならないことに注意してください。今回は std::pair 要素を構築するためにこの関数を利用しているので、以下のコードサンプルのようにリテラル値を指定して呼び出しても問題ありません。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::make_pair;
using std::pair;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> &vec) {
  for (auto i = 0; i < vec.size(); ++i) {
    cout << "(" << vec.at(i).first << "," << vec.at(i).second << ")"
         << "; ";
  }
  cout << endl;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "twelve"}, {32, "thirty-two"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVectorElements(vec1);

  vec1.emplace_back(55, "fifty-five");

  cout << "vec1: ";
  printVectorElements(vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

vec1: (12,twelve); (32,thirty-two); (43,forty-three);
vec1: (12,twelve); (32,thirty-two); (43,forty-three); (55,fifty-five);
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Vector