C++ で STLUnordered MapContainer を使用する
-
C++ で
std::unordered_map
要素を使用して順序付けされていないマップコンテナを宣言する -
contains
メンバー関数を使用して、指定された要素が C++ のマップに存在するかどうかを確認する -
erase
メンバー関数を使用して、C++ のマップから特定の要素を削除する -
C++ で
insert
メンバー関数を使用してマップに新しい要素を追加する
この記事では、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;