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

C++ STLのmultimap::erase()関数の使い方を徹底解説


本記事では、C++ STLにおけるmultimap::erase()関数の仕組み、構文、そして具体的な使用例について詳しく解説します。

C++ STLにおけるmultimapとは?

multimapは連想コンテナの一種で、mapコンテナと非常によく似た性質を持っています。キーと、それに対応付けられた値(マップドバリュー)の組み合わせからなる要素を、特定の順序で格納することができます。multimapの最大の特徴は、同じキーに対して複数の要素を関連付けられる点です。また、コンテナ内のデータは常にキーに基づいて自動的にソートされて管理されます。

multimap::erase()とは?

multimap::erase()は、C++ STLに標準で組み込まれている関数であり、<map>ヘッダーファイル内で定義されています。この関数は、multimapコンテナから要素を削除するために使用されます。

erase()は、「キーを指定して削除」「イテレータで位置を指定して削除」「開始位置と終了位置で範囲を指定して削除」の3通りの使い方が可能です。関数を実行すると、削除された要素の数だけmultimapコンテナのサイズが減少します。

構文

multimap_name.erase(key_type key);
multimap_name.erase(const_iterator it);
multimap_name.erase(const_iterator start, const_iterator end);

パラメータ

この関数は以下のパラメータを受け取ります。

  • key − 削除したい要素に関連付けられたキーを指定します。

  • it − 削除したい要素の位置を指すイテレータを指定します。

  • start, end − 削除対象となる要素の範囲を、開始位置から終了位置までで定義します。

戻り値

この関数は、コンテナから削除された要素の数を返します。

入力例

std::multimap<char, int> mymap;
mymap.insert({'a', 10});
mymap.insert({'b', 20});
mymap.insert({'c', 30});
mymap.erase('b');

出力例

a:10 c:30

使用例1:指定したキーの要素を削除する

#include<iostream>
#include<map>
using namespace std;
int main(){
    multimap<int,char > mul_1;
    // 要素を順に走査するためのイテレータを宣言
    multimap<int,char>:: iterator i;
    // multimap1に要素を挿入
    mul_1.insert(make_pair(0,'a'));
    mul_1.insert(make_pair(1,'b'));
    mul_1.insert(make_pair(2,'c'));
    mul_1.insert(make_pair(3,'d'));
    mul_1.insert(make_pair(4,'e'));
    mul_1.insert(make_pair(5,'f'));
    mul_1.insert(make_pair(6,'g'));
    // erase()を呼び出して要素を削除
    mul_1.erase(1);
    mul_1.erase(4);
    mul_1.erase(6);
    mul_1.erase(5);
    // multimap1の要素を表示
    cout<<"Elements in multimap1 are: "<<"\n";
    for( i = mul_1.begin(); i!= mul_1.end(); i++){
        cout<<(*i).first<<" "<< (*i).second << "\n";
    }
}

出力

上記のコードを実行すると、次のような出力が得られます。

Elements in multimap1 are:
0 a
2 c
3 d

使用例2:指定した範囲の要素を削除する

#include<iostream>
#include<map>
using namespace std;
int main(){
    multimap<int,char > mul_1;
    // 要素を順に走査するためのイテレータを宣言
    multimap<int,char>:: iterator i;
    // multimap1に要素を挿入
    mul_1.insert(make_pair(0,'a'));
    mul_1.insert(make_pair(1,'b'));
    mul_1.insert(make_pair(2,'c'));
    mul_1.insert(make_pair(3,'d'));
    mul_1.insert(make_pair(4,'e'));
    mul_1.insert(make_pair(5,'f'));
    mul_1.insert(make_pair(6,'g'));
    // 削除前のmultimap1の要素を表示
    cout<<"Elements in multimap1 are: "<<"\n";
    for( i = mul_1.begin(); i!= mul_1.end(); i++){
        cout<<(*i).first<<" "<< (*i).second << "\n";
    }
    // erase()を呼び出して範囲内の要素を一括削除
    auto start = mul_1.find(3);
    auto end = mul_1.find(6);
    mul_1.erase(start, end);
    // 削除後のmultimap1の要素を表示
    cout<<"Elements in multimap1 are: "<<"\n";
    for( i = mul_1.begin(); i!= mul_1.end(); i++){
        cout<<(*i).first<<" "<< (*i).second << "\n";
    }
}

出力

上記のコードを実行すると、次のような出力が得られます。

Elements in multimap1 are:
0 a
1 b
2 c
3 d
4 e
5 f
6 g
Elements in multimap1 are:
0 a
1 b
2 c
6 g

使用例3:指定した位置の要素を削除する

#include<iostream>
#include<map>
using namespace std;
int main(){
    multimap<int,char > mul_1;
    // 要素を順に走査するためのイテレータを宣言
    multimap<int,char>:: iterator i;
    // multimap1に要素を挿入
    mul_1.insert(make_pair(0,'a'));
    mul_1.insert(make_pair(1,'b'));
    mul_1.insert(make_pair(2,'c'));
    mul_1.insert(make_pair(3,'d'));
    mul_1.insert(make_pair(4,'e'));
    mul_1.insert(make_pair(5,'f'));
    mul_1.insert(make_pair(6,'g'));
    // 削除前のmultimap1の要素を表示
    cout<<"Elements in multimap1 are: "<<"\n";
    for( i = mul_1.begin(); i!= mul_1.end(); i++){
        cout<<(*i).first<<" "<< (*i).second << "\n";
    }
    // erase()を呼び出して指定位置の要素を削除
    auto first = mul_1.find(1);
    mul_1.erase(first);
    auto second = mul_1.find(6);
    mul_1.erase(second);
    auto third = mul_1.find(2);
    mul_1.erase(third);
    // 削除後のmultimap1の要素を表示
    cout<<"Elements in multimap1 are: "<<"\n";
    for( i = mul_1.begin(); i!= mul_1.end(); i++){
        cout<<(*i).first<<" "<< (*i).second << "\n";
    }
}

出力

上記のコードを実行すると、次のような出力が得られます。

Elements in multimap1 are:
0 a
1 b
2 c
3 d
4 e
5 f
6 g
Elements in multimap1 are:
0 a
3 d
4 e
5 f

まとめ

multimap::erase()を使えば、キー指定・イテレータによる位置指定・範囲指定のいずれかの方法で、柔軟に要素を削除できます。キーを指定した場合は、そのキーに関連付けられたすべての要素が削除され、戻り値で削除件数を確認できるため、デバッグや動作検証にも役立ちます。用途に応じて適切な呼び出し形式を選択しましょう。

  1. C++ STLのmap::erase()関数の使い方とサンプルコード解説

    この記事では、C++ STLにおけるmap::erase()関数の動作、構文、および具体的な使用例について詳しく解説します。 C++ STLにおけるマップ(map)とは? マップは連想コンテナの一種で、キー(key)とマップ値(mapped value)の組み合わせからなる要素を、特定の順序で格納することができます。マップコンテナ内のデータは常にキーに基づいて内部的にソートされており、各要素には一意のキーを通じてアクセスします。 map::erase()関数とは? map::erase()は、<map>ヘッダーファイルに定義されている関数で、マップコンテナから特定の要素、または指定

  2. C++のSTLでマルチマップ(multimap)を実装するプログラムの解説

    マルチマップ(multimap)は、C++の標準テンプレートライブラリ(STL)が提供する連想コンテナの一つで、複数の要素が同じキーを持てるという点を除けば、マップ(map)とよく似ています。マルチマップでは、キー値とマップ値のペアそのものが一意である必要があります。使用する主な関数mm::find() – マルチマップ内でキー値 b を持つ要素を検索します。見つかった場合はその要素へのイテレータを、見つからない場合は end() イテレータを返します。mm::erase() – 指定したキー値(またはイテレータが指す要素)をマルチマップから削除します。mm::equal_range() –