【C++】反復処理中に値を条件としてHashMapからエントリを削除する方法
この記事では、C++でHashMap(std::map)を反復処理している最中に、値を条件としてエントリを削除する方法を解説します。
入力: HashMap: { 1: "Mango",
2: "Orange",
3: "Banana",
4: "Apple" }, value = "Banana"
出力: HashMap: { 1: "Mango",
2: "Orange",
4: "Apple" }
説明: 値"Banana"に一致する3番目のキーと値のペアが削除されます。
入力: HashMap: { 1: "Yellow",
2: "White",
3: "Green" }, value = "White"
出力: HashMap: { 1: "Yellow",
3: "Green" }
解決策のアプローチ
C++では、erase()関数を使って要素を削除できます。この関数は、「キー名を指定して削除する方法」と「イテレータを指定して削除する方法」の2通りに対応しています。本チュートリアルでは、イテレータを使った削除方法を取り上げます。
基本的な考え方はシンプルです。HashMapを先頭から順に走査し、各要素の値が目的の値と一致した時点で、そのエントリを削除します。
注意点:イテレータの無効化
反復処理中に要素を削除する場合、erase(it)を呼び出した直後はイテレータitが無効になります。その状態で++itのように進めると未定義動作を引き起こすため注意が必要です。C++11以降では、erase()が「削除した要素の次の要素を指すイテレータ」を返すことを利用すれば、安全に削除を行えます。
サンプルコード
上記アプローチのC++コード
HashMapを反復処理しながら要素を削除する例:
#include<iostream>
#include<map> // map操作用ヘッダ
#include<string>
using namespace std;
int main(){
// HashMap(map)の作成。
map< int, string > fruits;
// キーと値のペアを挿入。
fruits[1] = "Mango";
fruits[2] = "Orange";
fruits[3] = "Banana";
fruits[4] = "Apple";
string value = "Banana";
// イテレータの作成。
map<int, string>::iterator it;
// 削除前のHashMapを表示。
cout << "HashMap before Deletion:\n";
for (it = fruits.begin(); it != fruits.end(); ++it)
cout << it->first << "->" << it->second << endl;
// 値が一致する要素を、反復処理中に安全に削除。
for (it = fruits.begin(); it != fruits.end(); ){
if (it->second == value)
it = fruits.erase(it); // erase()は次の要素を指すイテレータを返す
else
++it;
}
// 削除後のHashMapを表示。
cout << "HashMap After Deletion:\n";
for (it = fruits.begin(); it != fruits.end(); ++it)
cout << it->first << "->" << it->second << endl;
return 0;
}
実行結果
HashMap before Deletion: 1->Mango 2->Orange 3->Banana 4->Apple HashMap After Deletion: 1->Mango 2->Orange 4->Apple
まとめ
このチュートリアルでは、値を条件としてHashMapからエントリを削除する方法を解説しました。反復処理中に要素を安全に削除するポイントは、erase()が返す「次の要素を指すイテレータ」を正しく受け取ることです。同様の処理は、JavaやPythonなど他のプログラミング言語でも、各言語のAPIに合わせて実装できます。本チュートリアルが皆さんの学習のお役に立てば幸いです。
-
C++でべき乗(pow)関数を自作する方法
べき乗関数(power function)は、基数と指数という2つの数値を受け取り、基数を指数回だけ掛け合わせた結果(累乗)を求めるための関数です。例を見てみましょう。基数 = 2 指数 = 5 2^5 = 32 つまり、2の5乗は32になります。ここでは、標準ライブラリの pow() 関数に頼らず、C++でべき乗計算を自前で実装する方法を紹介します。サンプルプログラム#include <iostream> using namespace std; int main(){ int x, y, ans = 1; cout << 基数を入力してくださ
-
値を指定してHashMapからキーを取得するJavaプログラムの書き方
本記事では、値を指定してHashMapから対応するキーを取得する方法を解説します。JavaのHashMapとは、Mapインターフェースをハッシュテーブルベースで実装したクラスで、キーと値のペア(エントリー)を管理するコレクションです。通常はキーから値を取り出しますが、逆に値からキーを検索したいというケースも少なくありません。以下に、今回実装する内容の具体例を示します。入力例:入力HashMap: {Java=8, Scala=5, Python=15} 検索する値: 8期待される出力:値 8 に対応するキー: Javaアルゴリズムステップ1 - 処理を開始する ステップ2 - 必要な変数を宣言