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

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

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

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

mapは連想コンテナの一種で、キー値(key)とマップ値(mapped value)の組み合わせからなる要素を、特定の順序で格納することができます。mapコンテナ内部では、データは常にキーに基づいて自動的にソートされており、格納された各値には一意なキーを通じてアクセスします。

map::begin()とは?

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

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

構文

map_name.begin();

パラメータ

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

戻り値

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

begin()の使用例

以下のようにmapに要素を挿入した後、begin()を呼び出すと、最初の要素(キー順で最小の要素)へのイテレータを取得できます。

std::map<char, int> mymap;
mymap.insert({'a', 10});
mymap.insert({'b', 20});
mymap.insert({'c', 30});
auto it = mymap.begin(); // 'a' を指すイテレータ

サンプルコード

#include <bits/stdc++.h>
using namespace std;
int main() {
    map<int, int> TP_1;
    TP_1[1] = 10;
    TP_1[2] = 20;
    TP_1[3] = 30;
    TP_1[4] = 40;
    cout << "TP_1の要素一覧:\n" << "\tKEY\tELEMENT\n";
    for (auto i = TP_1.begin(); i != TP_1.end(); i++) {
        cout << "\t" << i->first << "\t" << i->second << '\n';
    }
    return 0;
}

出力結果

TP_1の要素一覧:
	KEY	ELEMENT
	1	10
	2	20
	3	30
	4	40

map::end()とは?

map::end()もC++ STLに組み込まれた関数で、<map>ヘッダーファイル内で定義されています。end()は、コンテナ内の最後の要素の「次」の位置(末尾の後ろ)を参照するために使用されます。

この関数は、コンテナの最後の要素の次を指すイテレータを返します。コンテナが空の場合、返されるイテレータは参照解除できません。

通常、begin()とend()は組み合わせて使用され、範囲を指定することでmapコンテナ全体を走査(イテレート)する際に活用されます。

構文

map_name.end();

パラメータ

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

戻り値

mapコンテナの最後の要素の次の位置を指すイテレータを返します。

end()の使用例

end()が指す位置には実際の要素が存在しないため、そのまま参照解除しようとするとエラーになります。あくまで「走査の終端を示す目印」として扱うのが正しい使い方です。

std::map<char, int> mymap;
mymap.insert({'a', 10});
mymap.insert({'b', 20});
mymap.insert({'c', 30});
mymap.end(); // 終端の次を指すため、参照解除するとエラーになる

サンプルコード

#include <bits/stdc++.h>
using namespace std;
int main() {
    map<int, int> TP_1;
    TP_1[1] = 10;
    TP_1[2] = 20;
    TP_1[3] = 30;
    TP_1[4] = 40;
    cout << "TP_1の要素一覧:\n" << "\tKEY\tELEMENT\n";
    for (auto i = TP_1.begin(); i != TP_1.end(); i++) {
        cout << "\t" << i->first << "\t" << i->second << '\n';
    }
    return 0;
}

出力結果

TP_1の要素一覧:
	KEY	ELEMENT
	1	10
	2	20
	3	30
	4	40
  1. C++ STLのセット(set)とマップ(map)とは?違いと基本的な使い方を解説

    セット(std::set)とは セット(Set)は抽象データ型の一種で、要素の値そのものが識別子として機能するため、すべての要素が一意である必要があります。一度セットに追加した要素の値を直接変更することはできませんが、該当する要素を削除してから、変更後の値を新たに挿入し直すことは可能です。 マップ(std::map)とは マップ(Map)は、要素を「キー」と「値」のペアとして格納する連想コンテナです。各要素はキー値(key)とマップ値(mapped value)を持ち、同一のキー値を持つ要素が複数存在することはありません。 以上の説明から、両者の違いは次のように整理できます。 セット:

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

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