C++ で STLUnordered MapContainer を使用する

胡金庫 2023年10月12日
  1. C++ で std::unordered_map 要素を使用して順序付けされていないマップコンテナを宣言する
  2. contains メンバー関数を使用して、指定された要素が C++ のマップに存在するかどうかを確認する
  3. erase メンバー関数を使用して、C++ のマップから特定の要素を削除する
  4. C++ で insert メンバー関数を使用してマップに新しい要素を追加する
C++ で STLUnordered MapContainer を使用する

この記事では、C++ で STL unordered_map コンテナを使用する方法のいくつかの方法について説明します。

C++ で std::unordered_map 要素を使用して順序付けされていないマップコンテナを宣言する

std::unordered_map 要素は、各キーが一意であるキーと値のペアの連想コンテナを実装します。std::map とは対照的に、std::unordered_map コンテナは要素をソートされた順序で格納しません。したがって、コンテナは主に要素のルックアップに使用され、位置は重要ではありません。さらに、オブジェクトの存続期間中の要素の位置は、固定されることが保証されていません。したがって、プログラマーは順序を未定義として扱う必要があります。

次の例は、unordered_map コンテナのリストの初期化を示してから、両方のマップの内容を出力します。m1 要素の降順は、それらがソートされていることを意味するものではないことに注意してください。

#include <iostream>
#include <map>
#include <unordered_map>

using std::cout;
using std::endl;
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::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  std::map<int, string> m2 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  printMap(m1);
  printMap(m2);

  return EXIT_SUCCESS;
}

出力:

4 : orange;
3 : grape;
2 : banana;
1 : apple;

1 : apple;
2 : banana;
3 : grape;
4 : orange;

contains メンバー関数を使用して、指定された要素が C++ のマップに存在するかどうかを確認する

contains メンバー関数は、C++ 20 の更新以降、std::unordered_map コンテナーの一部になっています。この関数を使用して、指定された要素がマップに存在するかどうかを確認できます。このコマンドは、キー値を唯一の引数として受け入れ、キーが見つかった場合は true を返します。この関数の平均実行時間は一定であり、最悪の場合はコンテナー自体のサイズに応じて線形になります。

#include <iostream>
#include <map>
#include <unordered_map>

using std::cout;
using std::endl;
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::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  for (int x : {1, 2, 3, 4, 5}) {
    if (m1.contains(x)) {
      cout << x << ": Found\n";
    } else {
      cout << x << ": Not found\n";
    }
  }

  return EXIT_SUCCESS;
}

出力:

1: Found
2: Found
3: Found
4: Found
5: Not found

erase メンバー関数を使用して、C++ のマップから特定の要素を削除する

erase メンバー関数を利用して、指定されたキーと値のペアをマップから削除できます。この関数には 3つのオーバーロードがあり、最初のオーバーロードはイテレーターを map 要素に移動します。これは、コンテナーから削除する必要があります。2 番目の関数のオーバーロードは、マップから削除される範囲を指定するために 2つのイテレーターを必要とします。指定された範囲は、呼び出し元のコンテナオブジェクト内で有効な範囲である必要があることに注意してください。3 番目のオーバーロードは、削除する必要のある要素のキー値を取ることができます。

次の例では、キー値として偶数を持つ各要素を削除します。

#include <iostream>
#include <map>
#include <unordered_map>

using std::cout;
using std::endl;
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::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  for (auto it = m1.begin(); it != m1.end();) {
    if (it->first % 2 == 0)
      it = m1.erase(it);
    else
      ++it;
  }
  printMap(m1);

  return EXIT_SUCCESS;
}

出力:

3 : grape;
1 : apple;

C++ で insert メンバー関数を使用してマップに新しい要素を追加する

unordered_map コンテナのもう 1つのコアメンバー関数は、insert 関数です。これを使用して、マップに新しい要素を追加できます。関数には複数のオーバーロードがありますが、キーと値のペアをとる最初のオーバーロードを利用します。また、std::make_pair 関数を使用して、指定された引数値で新しいペアを作成することに注意してください。

#include <iostream>
#include <map>
#include <unordered_map>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

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

int main() {
  std::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  vector<string> vec{"papaya", "olive", "melon"};

  auto count = 0;
  for (const auto& item : vec) {
    m1.insert(std::make_pair(count, item));
  }
  printMap(m1);

  return EXIT_SUCCESS;
}

出力:

0 : papaya;
4 : orange;
3 : grape;
2 : banana;
1 : apple;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Map