C++
 Computer >> コンピューター >  >> プログラミング >> C++

【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に合わせて実装できます。本チュートリアルが皆さんの学習のお役に立てば幸いです。

  1. 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 << 基数を入力してくださ

  2. 値を指定してHashMapからキーを取得するJavaプログラムの書き方

    本記事では、値を指定してHashMapから対応するキーを取得する方法を解説します。JavaのHashMapとは、Mapインターフェースをハッシュテーブルベースで実装したクラスで、キーと値のペア(エントリー)を管理するコレクションです。通常はキーから値を取り出しますが、逆に値からキーを検索したいというケースも少なくありません。以下に、今回実装する内容の具体例を示します。入力例:入力HashMap: {Java=8, Scala=5, Python=15} 検索する値: 8期待される出力:値 8 に対応するキー: Javaアルゴリズムステップ1 - 処理を開始する ステップ2 - 必要な変数を宣言