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

【C++ STL】multimap::cbegin()とmultimap::cend()の使い方を徹底解説

本記事では、C++ STLにおける multimap::cbegin() および multimap::cend() 関数の動作、構文、具体的な使用例について詳しく解説します。

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

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

multimap::cbegin()とは?

multimap::cbegin() はC++ STLに組み込まれた関数で、<map> ヘッダファイルで定義されています。cbegin() は「constant begin(定数の先頭)」を意味し、multimapコンテナの最初の要素を指す定数イテレータを返します。返されるイテレータは定数イテレータのため、要素の内容を変更することはできません。ただし、イテレータをインクリメントまたはデクリメントすることで、コンテナ内の要素を走査することが可能です。

構文

multi.cbegin();

パラメータ

この関数は引数を受け取りません。

戻り値

関連付けられたmultimapコンテナの最初の要素を指すイテレータを返します。

入力例

multimap<char, int> newmap;
newmap.insert(make_pair('a', 1));
newmap.insert(make_pair('b', 2));
newmap.insert(make_pair('c', 3));
newmap.cbegin(); // 先頭要素 'a' を指す

出力

a = 1

使用例

#include <bits/stdc++.h>
using namespace std;
int main(){
    // コンテナを作成
    multimap<int, int> mul;
    // emplace_hintを使って要素を挿入
    mul.emplace_hint(mul.begin(), 1, 10);
    mul.emplace_hint(mul.begin(), 2, 20);
    mul.emplace_hint(mul.begin(), 2, 30);
    mul.emplace_hint(mul.begin(), 1, 40);
    mul.emplace_hint(mul.begin(), 1, 50);
    mul.emplace_hint(mul.begin(), 5, 60);
    auto it = mul.cbegin();
    cout << "multimapの先頭要素: ";
    cout << "{" << it->first << ", " << it->second << "}\n";
    cout << "\nmultimapの要素一覧:\n";
    cout << "KEY\tELEMENT\n";
    for (auto i = mul.cbegin(); i != mul.cend(); i++){
        cout << i->first << "\t" << i->second << endl;
    }
    return 0;
}

出力

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

multimapの先頭要素: {1, 50}
multimapの要素一覧:
KEY ELEMENT
1 50
1 40
1 10
2 30
2 20
5 60

multimap::cend()とは?

multimap::cend() もまた、<map> ヘッダファイルで定義されているC++ STLの組み込み関数です。cend() は「constant end(定数の末尾)」を意味し、関連するmultimapコンテナの最後の要素の「次」の位置を指す定数イテレータを返します。

返されるイテレータは定数イテレータのため、要素の内容を変更することはできません。イテレータを進めたり戻したりすることで、コンテナ内の要素を走査できます。

multimap::cbegin() と multimap::cend() を組み合わせて使うことで、範囲の始点と終点を指定しながらコンテナ全体を効率的に走査することができます。

構文

multi.cend();

パラメータ

この関数は引数を受け取りません。

戻り値

関連付けられたmultimapコンテナの最後の要素の次を指すイテレータを返します。

入力例

multimap<char, int> newmap;
newmap.insert(make_pair('a', 1));
newmap.insert(make_pair('b', 2));
newmap.insert(make_pair('c', 3));
auto it = newmap.cend();
cout << *it; // 終端の次を参照 → エラー(未定義動作)

出力

error

cend()が返すイテレータは「最後の要素の次」を指すため、参照解除(*it)を行うと未定義動作になります。cend()はあくまで走査の終了条件として使用しましょう。

使用例

#include <bits/stdc++.h>
using namespace std;
int main(){
    // コンテナを作成
    multimap<int, int> mul;
    // emplace_hintを使って要素を挿入
    mul.emplace_hint(mul.begin(), 1, 10);
    mul.emplace_hint(mul.begin(), 2, 20);
    mul.emplace_hint(mul.begin(), 2, 30);
    mul.emplace_hint(mul.begin(), 1, 40);
    mul.emplace_hint(mul.begin(), 1, 50);
    mul.emplace_hint(mul.begin(), 5, 60);
    cout << "\nmultimapの要素一覧:\n";
    cout << "KEY\tELEMENT\n";
    for (auto i = mul.cbegin(); i != mul.cend(); i++){
        cout << i->first << "\t" << i->second << endl;
    }
    return 0;
}

出力

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

multimapの要素一覧:
KEY ELEMENT
1 50
1 40
1 10
2 30
2 20
5 60
  1. C++ STLのlist::cbegin()とcend()関数の使い方を解説

    本記事では、C++におけるlist::cbegin()およびlist::cend()関数の動作について解説します。list::cbegin()とlist::cend()は、C++標準テンプレートライブラリ(STL)の一部として提供されているメンバ関数です。これらの関数を呼び出すには、ヘッダーファイル<list>をインクルードする必要があります。list::cbegin()とはlist::cbegin()は、リストの先頭要素を指す定数イテレータ(const_iterator)を返す関数です。このイテレータを使えばリストを走査することはできますが、リスト内の値を変更することはできません

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

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