本記事の目的
AtCoder Beginner Contest 347に取り組んでいた際に行き詰ってしまい、解説を読んだところ、私の知らないsetなるものを使って解くことが推奨されていたので、調べてみました。
以下はその学習のまとめです。
setとは
setは重複を許さず(一意性)、昇順にデータを格納するデータ構造です。
#include <iostream>
#include <set>
int main() {
// 空のsetを作成
std::set<int> mySet;
// 要素を追加
mySet.insert(30);
mySet.insert(10);
mySet.insert(50);
mySet.insert(20);
mySet.insert(40);
mySet.insert(10); // 重複するため無視される
// 要素をループして出力
std::cout << "Setの要素:";
for (auto it = mySet.begin(); it != mySet.end(); ++it) {
std::cout << " " << *it;
}
std::cout << std::endl;
return 0;
}
実行結果
Setの要素: 10 20 30 40 50
setの使い方
setの宣言
#include <set>
このようにしてヘッダーファイルを読み込んで
std::set<型名> mySet;
のようにして宣言することができます。<>内の型名は格納するデータの型名を入力します。
setの初期化
setは、std::initializer_listを使った方法や、{}を使った方法で初期化が可能です。
std::set<int> empty; // 空のstd::set
std::set<int> mySet{ 5, 1, 2, 4, 1 }; // {}を使った方法で初期化
要素の追加、削除、変更、検索
mySet.insert(追加する要素); // 要素の追加
mySet.erase(削除する要素); // 要素の削除
// 要素の変更(setでは要素の値を直接変更することはできないので、削除して再挿入する)
int old_value = 40;
int new_value = 45;
mySet.erase(old_value);
mySet.insert(new_value);
// 要素の検索(指定した要素が存在するか確認する)
int target = 30;
auto it = mySet.find(target); // targetがmySetに存在しない場合、itにはmySet.end()が返される