C++におけるペア(pair)のセット(set)の使い方
C++のsetとpairの基本
C++のsetは連想コンテナの一種で、重複しない一意な要素のみを格納します。一度セットに追加された要素は変更できず、内容を変えたい場合は一度削除してから再び追加する必要があります。
一方、pairは<utility>ヘッダーで定義された構造体で、2つの値をひとまとめに扱うために使用します。pairの2つの値は、同じ型でも異なる型でも問題ありません。各値にはfirstとsecondというメンバーを通じて個別にアクセスできます。
pairの要素の順序は固定されており(first、second)、この特性により、異なる型の2つの値を1つの単位として組み合わせることが可能です。
要素へのアクセスは、1つ目の要素に対してはvariable_name.first、2つ目の要素に対してはvariable_name.secondを使用します。
ペアのセット(set of pairs)とは
- ペアのセットでは、重複したpairは格納できません。
- セット内の要素(pair)は、キーとなる各pairのfirst要素を基準に自動的にソートされます。firstが等しい場合はsecondの値で比較されます。
- 特定のpairの検索・追加・削除、さらにセット内に存在するpairの個数取得などの操作が可能です。
- 宣言の構文は以下の通りです。
set< pair<datatype1, datatype2> > set_name;
set< pair<int, int> > set1;
この例では、set1は「2つのint型の値からなるpair」を格納するset型のオブジェクトです。
サンプルコード
次のコードは、配列内の奇数どうしを組み合わせてペアを作成し、それをセットに挿入して表示する例です。
#include <bits/stdc++.h>
using namespace std;
int main(){
int arr[] = { 2, 3, 1, 6, 9, 7, 10, 2 };
int n = 8;
set<pair<int, int>> set1;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (arr[i] % 2 == 1 && arr[j] % 2 == 1) {
// 奇数どうしのペアを作成
pair<int, int> p1 = make_pair(arr[i], arr[j]);
// セットに挿入
set1.insert(p1);
}
}
}
// ペアを表示
for (auto const &var : set1) {
cout << "(" << var.first << ", " << var.second << ")" << " ";
}
// セットをクリア
set1.clear();
return 0;
}
出力結果
(1, 7) (1, 9) (3, 1) (3, 7) (3, 9) (9, 7)
出力結果から、配列内の奇数(3, 1, 9, 7)のすべての組み合わせが、first要素を基準に昇順でソートされて表示されていることがわかります。重複するペアは自動的に除外されるため、セットには一意のペアだけが保持されます。
-
C++ STLのセット(set)とマップ(map)とは?違いと基本的な使い方を解説
セット(std::set)とは セット(Set)は抽象データ型の一種で、要素の値そのものが識別子として機能するため、すべての要素が一意である必要があります。一度セットに追加した要素の値を直接変更することはできませんが、該当する要素を削除してから、変更後の値を新たに挿入し直すことは可能です。 マップ(std::map)とは マップ(Map)は、要素を「キー」と「値」のペアとして格納する連想コンテナです。各要素はキー値(key)とマップ値(mapped value)を持ち、同一のキー値を持つ要素が複数存在することはありません。 以上の説明から、両者の違いは次のように整理できます。 セット:
-
C++のSTLでpair(ペア)を実装するプログラム
pair(ペア)は、2つのデータオブジェクトで構成されるシンプルなコンテナです。C++では <utility> ヘッダに定義されており、異なる型同士の値をひとつの単位としてまとめて扱うことができます。 first = 1つ目の要素。「first」として参照される second = 2つ目の要素。要素の順序は固定(first → second) pairは代入・比較・コピーが可能です。型の異なる2つの値を組み合わせて保持したい場合に便利で、関数から2つの戻り値を返したいときや、キーと値のペアを扱う場面などでよく利用されます。 構文: pair<データ型1, データ型2>