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

C++ STLのセット(set)とマップ(map)とは?違いと基本的な使い方を解説


セット(std::set)とは

セット(Set)は抽象データ型の一種で、要素の値そのものが識別子として機能するため、すべての要素が一意である必要があります。一度セットに追加した要素の値を直接変更することはできませんが、該当する要素を削除してから、変更後の値を新たに挿入し直すことは可能です。

マップ(std::map)とは

マップ(Map)は、要素を「キー」と「値」のペアとして格納する連想コンテナです。各要素はキー値(key)とマップ値(mapped value)を持ち、同一のキー値を持つ要素が複数存在することはありません。

以上の説明から、両者の違いは次のように整理できます。

  • セット: キー(値そのもの)のみを保持する
  • マップ: キーと、それに紐づく値のペアを保持する

どちらのコンテナも要素は自動的にソート(既定では昇順)され、常に一意性が保たれます。内部的には赤黒木(red-black tree)のような平衡二分探索木で実装されているため、挿入・検索・削除をいずれも O(log n) の計算量で効率的に行える点も大きな特長です。

順序なし・重複ありのバリエーション

ソートや順序付けが不要なケースには unordered_set / unordered_map が、同じキー(または値)の重複を許したいケースには multiset / multimap がそれぞれ用意されています。用途に応じて適切なコンテナを使い分けることで、より柔軟なデータ管理が可能になります。

セットのサンプルコード

空のセットを作成し、7つの整数を挿入したうえで、範囲ベースforループですべての要素を表示する例です。挿入した順序に関係なく、出力時には昇順に並んでいる点に注目してください。

#include<iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
    set<int> s; // 空のsetコンテナを初期化
    set<int>::iterator it; // イテレータを宣言
    s.insert(7); // setコンテナsに要素を挿入
    s.insert(6);
    s.insert(1);
    s.insert(4);
    s.insert(2);
    s.insert(9);
    s.insert(10);
    cout << "セット内の要素:\n";
    for (auto it : s)
        cout << it << " "; // setコンテナの要素を出力
    return 0;
}

実行結果

1 2 4 6 7 9 10

マップのサンプルコード

char型のキーとint型の値を持つマップを作成し、pairを使って要素を挿入する例です。イテレータの first にキーが、second に対応する値が格納されます。

#include<iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
    map<char, int> m; // マップを初期化
    map<char, int>::iterator iter; // イテレータを宣言
    m.insert(pair<char, int>('a', 10)); // マップに値を挿入
    m.insert(pair<char, int>('b', 20));

    cout << "マップ内の要素:\n";
    for (iter = m.begin(); iter != m.end(); iter++)
        cout << "[ " << iter->first << ", " << iter->second << "]\n"; // マップの内容を出力
    return 0;
}

実行結果

マップ内の要素: 
[ a, 10] 
[ b, 20]

  1. C++ STLのset::max_size()関数の使い方を徹底解説

    この記事では、C++ STLにおける set::max_size() 関数について、その構文、動作の仕組み、戻り値を詳しく解説します。C++ STLのsetとは?C++ STLのsetは、重複しない一意の要素を保持するコンテナであり、通常は昇順にソートされた状態で管理されます。要素の値そのものが要素を識別する役割を果たすため、setには同じ値を複数格納することができません。一度setコンテナに追加した値は後から変更することはできませんが、値の削除や新たな追加は可能です。内部的には、setは二分探索木(赤黒木)として実装されており、高速な検索を実現しています。set::max_size()とは?

  2. C++ STLのset::get_allocator()関数の使い方を解説

    本記事では、C++ STLのset::get_allocator()関数について、その構文、動作、そして戻り値を詳しく解説します。C++ STLにおけるsetとは?C++ STLのsetは、要素が必ず一意である必要がある連想コンテナの一種で、要素は決められた順序で保持されます。set内では要素の値そのものがその要素を識別するキーとなるため、重複した要素を持つことができません。また、一度setコンテナに追加した値は後から変更することはできませんが、値の削除や新たな追加は可能です。setは内部的に二分探索木として実装され、高速な検索を実現しています。set::get_allocator()とは?g