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

C++ STL入門:multimap::begin()とmultimap::end()の使い方を徹底解説


本記事では、C++ STLに用意されているmultimap::begin()関数とmultimap::end()関数について、その動作の仕組み、構文、具体的なコード例を交えながら詳しく解説します。

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

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

multimap::begin()とは?

multimap::begin()は、C++ STLに組み込まれたメンバ関数の一つで、<map>ヘッダーファイル内で定義されています。begin()は、対象のmultimapコンテナの先頭にある要素にアクセスするために使用されます。

この関数は、コンテナの最初の要素を指すイテレータを返します。ただし、コンテナが空である場合、返されたイテレータを参照解除(デリファレンス)することはできないため注意が必要です。

構文

multimap_name.begin();

パラメータ

この関数は引数(パラメータ)を受け取りません。

戻り値

multimapコンテナの先頭要素を指すイテレータを返します。

入力例

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

出力例

a:10

使用例:multimap::begin()

#include <bits/stdc++.h>
using namespace std;
int main(){
    multimap<int, int> mul;
    // multimapに要素を挿入
    mul.insert({ 1, 10 });
    mul.insert({ 2, 20 });
    mul.insert({ 3, 30 });
    mul.insert({ 4, 40 });
    mul.insert({ 5, 50 });
    // multimapの先頭のペアを取得
    auto i = mul.begin();
    cout<<"First element in multimap is: ";
    cout << "{" << i->first << ", " << i->second << "}\n";
    // begin()とend()を使ってmultimapの全要素を表示
    cout << "\nElements in multimap is : \n";
    cout << "KEY\tELEMENT\n";
    for (auto it = mul.begin(); it != mul.end(); ++it){
        cout << it->first << '\t' << it->second << '\n';
    }
    return 0;
}

実行結果

上記のコードを実行すると、以下の出力が得られます。

First element in multimap is: {1, 10}
Elements in multimap is :
KEY ELEMENT
1 10
2 20
3 30
4 40
5 50

multimap::end()とは?

multimap::end()も、C++ STLに組み込まれたメンバ関数の一つで、<map>ヘッダーファイル内で定義されています。end()は、multimapコンテナの末尾要素の「次」の位置(past-the-end)にある要素にアクセスするために使用されます。

この関数が返すのは、コンテナの最後の要素の隣の位置を指すイテレータです。end()が指す位置には実際の要素は存在しないため、このイテレータを参照解除するとエラーになります。コンテナが空の場合も同様に、参照解除はできません。

実務では、begin()とend()を組み合わせて範囲を指定し、mapコンテナ全体を順番に走査(イテレート)するのが一般的な使い方です。

構文

multimap_name.end();

パラメータ

この関数は引数(パラメータ)を受け取りません。

戻り値

コンテナの末尾要素の次の位置を指すイテレータを返します。この位置には有効な要素が存在しないため、参照解除しようとするとエラーとなります。

入力例

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

出力例

error

使用例:multimap::end()

#include <bits/stdc++.h>
using namespace std;
int main(){
    multimap<int, int> mul;
    // multimapに要素を挿入
    mul.insert({ 1, 10 });
    mul.insert({ 2, 20 });
    mul.insert({ 3, 30 });
    mul.insert({ 4, 40 });
    mul.insert({ 5, 50 });
    // begin()とend()を使ってmultimapの全要素を表示
    cout << "\nElements in multimap is : \n";
    cout << "KEY\tELEMENT\n";
    for (auto it = mul.begin(); it != mul.end(); ++it){
        cout << it->first << '\t' << it->second << '\n';
    }
    return 0;
}

実行結果

上記のコードを実行すると、以下の出力が得られます。

Elements in multimap is :
KEY ELEMENT
1 10
2 20
3 30
4 40
5 50

まとめ

multimap::begin()はコンテナの先頭要素を指すイテレータを、multimap::end()は末尾要素の次の位置を指すイテレータをそれぞれ返します。この2つを組み合わせれば、「for (auto it = mul.begin(); it != mul.end(); ++it)」のような形でmultimap内の全要素を安全に走査できます。end()が指す位置には実体が存在しないため、決して参照解除しない――この一点だけ覚えておけば、multimapの操作で迷うことはほぼなくなるでしょう。

  1. 【C++ STL】set::begin()とset::end()の使い方をサンプルコードで解説

    C++のSTLコンテナであるstd::setには、要素を走査するための重要なメンバ関数としてbegin()とend()があります。 set::begin()は双方向イテレータの一種で、setコンテナの先頭要素を指すイテレータを返します。setは自動的に要素が昇順にソートされるため、begin()が指すのは常に最小の値を持つ要素です。 set::end()も同様に双方向イテレータを返しますが、こちらは最後の要素そのものではなく、最後の要素の「次」の位置(終端)を指す点に注意が必要です。つまり、end()が返すイテレータは有効な要素を参照しておらず、主にループの終了条件として使用されます。 サンプ

  2. C++ STLのmap・multimapを降順で扱う方法

    一般に、C++のmapおよびmultimapは、デフォルトではキーを昇順で格納します。しかし、第3テンプレート引数として比較用の関数オブジェクトstd::greaterを指定することで、要素を降順で格納することも簡単にできます。 mapを降順で使用する 使用する主なメンバ関数 m.find() – 指定したキーを持つ要素へのイテレータを返します。見つからない場合はend()イテレータを返します。 m.erase() – マップから指定したキーの要素を削除します。 m.equal_range() – イテレータのペア(pair)を返します。このペアは、指定したキーと等しいキーを持つすべての要素