C++ で STL マップコンテナを使用する

胡金庫 2023年10月12日
  1. C++ で std::map を使用してマップコンテナオブジェクトを宣言する
  2. C++ で find メンバー関数を使用してマップ内の特定の要素を検索する
  3. C++ で insert メンバー関数を使用してマップに要素を格納する
  4. C++ で merge メンバー関数を使用して 2つのマップオブジェクトの要素を結合する
C++ で STL マップコンテナを使用する

このガイドでは、C++ で STL マップコンテナを使用する方法に関するいくつかの方法を紹介します。

C++ で std::map を使用してマップコンテナオブジェクトを宣言する

std::map コンテナは、キーが一意である、ソートされたキーと値のペアのデータ構造を実装します。キー値は、デフォルトでペア要素を昇順で並べ替えます。ただし、ユーザーはオプションで比較関数を std::map テンプレートに渡すことができます。map オブジェクトは、各要素が別々の中括弧で指定されている値のリストで初期化できます。この場合、string ペアのマップを作成し、その要素を cout ストリームに出力します。各要素は、for ループの std::pair メンバーとしてアクセスされることに注意してください。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  printMap(m1);

  return EXIT_SUCCESS;
}

出力:

11600K : Core i5;
11700K : Core i7;
11900K : Core i9;
1390P : Xeon W;

C++ で find メンバー関数を使用してマップ内の特定の要素を検索する

find メンバー関数は、map コンテナで特定のキーと値のペアを検索するのに役立ちます。ルックアップ操作には対数の複雑さがあります。find 関数はキーへの参照を取得し、同等のキーを持つ要素にイテレータを返します。指定されたキーを持つ要素が見つからない場合、過去の終了イテレータが返されます。

次のコードスニペットは、範囲イテレータを使用して新しい map コンテナを初期化する方法を示しています。最初のイテレータは、find 関数を使用して取得されることに注意してください。また、返されたイテレータの有効性を確認すると便利な場合があります。

#include <cassert>
#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  std::map<string, string> m2(m1.find("11700K"), m1.end());
  printMap(m2);

  auto ret = m1.find("11700K");
  assert(ret != m1.end());
  std::map<string, string> m3(ret, m1.end());
  printMap(m3);

  return EXIT_SUCCESS;
}

出力:

11700K : Core i7;
11900K : Core i9;
1390P : Xeon W;

C++ で insert メンバー関数を使用してマップに要素を格納する

insert メンバー関数を使用して、既存の map コンテナに新しい要素を追加できます。insert メンバーは、追加するオブジェクトへの参照を取得し、挿入された要素へのイテレータと成功した挿入ステータスを示す bool 値で構成されるコンテナ std::pair を返します。挿入が失敗すると、イテレータは操作を妨げた要素を指します。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  auto ret1 = m1.insert({"1390P", "Xeon W"});
  if (!ret1.second) {
    cout << "Not inserted!" << endl;
  }

  ret1 = m1.insert({"1390", "Xeon W"});
  if (!ret1.second) {
    cout << "Not inserted!" << endl;
  }
  printMap(m1);

  return EXIT_SUCCESS;
}

出力:

Not inserted!
11600K : Core i5;
11700K : Core i7;
11900K : Core i9;
1390 : Xeon W;
1390P : Xeon W;

C++ で merge メンバー関数を使用して 2つのマップオブジェクトの要素を結合する

merge メンバー関数を使用して、2つのマップコンテナの要素を結合できます。これは、結合された要素を格納する必要がある map オブジェクトから呼び出され、引数として別の map を取ります。操作後、転送された要素へのすべてのポインタと参照が有効になります。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  std::map<string, string> m4 = {
      {"11900KF", "Core i9"}, {"11600T", "Core i5"}, {"11700K", "Core i7"}};

  m1.merge(m4);
  printMap(m1);

  return EXIT_SUCCESS;
}

出力:

11600K : Core i5;
11600T : Core i5;
11700K : Core i7;
11900K : Core i9;
11900KF : Core i9;
1390P : Xeon W;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Map