- setとは?
- 宣言
- for文での表示
- 要素数の取得(size())
- 追加と削除(insert & erase)
- 空にする(clear())
- 要素の存在を確かめる(find)
- 最小・最大を取得(先頭・末尾の取得)
setとは?
- setは順序付き集合と呼ばれ、重複を許さず、昇順に並ぶという特徴があります。
- ↓↓本記事で参考にしたサイト
宣言
- #include <set>をして、
std::set<型名> st;
と宣言します。宣言と同時に初期化したいときは、{}で括って
std::set<int> st{ 3, 4, 2, 3 };
という風にします。
for文での表示
(1) イテレータを使う場合
- mapあたりと近い感じです。
ソースコード
#include <iostream> #include <set> int main() { std::set<int> st{ 3, 4, 2, 3 }; //表示 std::cout << "st = { "; for (auto ite = st.begin(); ite != st.end(); ite++) { std::cout << *ite << ", "; } puts("}"); return 0; }
(2) 範囲for文を使う場合
- こちらの方がコードを短く書けます。
ソースコード
#include <iostream> #include <set> int main() { std::set<int> st{ 3, 4, 2, 3 }; //表示 std::cout << "st = { "; for(auto v: st) { std::cout << v << ", "; } puts("}"); return 0; }
実行結果
- (1), (2)どちらでも同じ結果になります。
- 重複は許さないので3は1つしか表示されません。
st = { 2, 3, 4, }
要素数の取得(size())
- sizeを使えばできます。
- こちらもvectorやmapなどと同じですね。
ソースコード
#include <iostream> #include <set> int main() { std::set<int> st{ 3, 4, 2, 3 }; std::cout << "要素数:" << st.size() << std::endl; //表示 std::cout << "st = { "; for (auto ite = st.begin(); ite != st.end(); ite++) { std::cout << *ite << ", "; } puts("}"); return 0; }
実行結果
要素数:3 st = { 2, 3, 4, }
追加と削除(insert & erase)
- 追加はinsert、削除はeraseを使います。
ソースコード
#include <iostream> #include <set> int main() { std::set<int> st{ 3, 4, 2, 3 }; //8を追加 st.insert(8); //2を削除 st.erase(2); // 表示 std::cout << "st = { "; for (auto ite = st.begin(); ite != st.end(); ite++) { std::cout << *ite << ", "; } puts("}"); return 0; }
実行結果
st = { 3, 4, 8, }
空にする(clear())
- clearを使えばできます。
- これもvectorやmapなどと同じですね。
ソースコード
#include <iostream> #include <set> int main() { std::set<int> st{ 3, 4, 2, 3 }; st.clear(); std::cout << "要素数:" << st.size() << std::endl; return 0; }
実行結果
要素数:0
要素の存在を確かめる(find)
- find(検索したい要素)をして、setの終端イテレータと一致しなければ存在すると評価されます。
ソースコード
#include <iostream> #include <set> int main() { std::set<int> st{ 3, 4, 2, 3 }; //nがあるか調べる int n = 3; if (st.find(n) != st.end()) { std::cout << "n = " << n << "が存在" << std::endl; } else { std::cout << "n = " << n << "がない" << std::endl; } }
実行結果
n = 3が存在
最小・最大を取得(先頭・末尾の取得)
- 昇順に要素が並ぶので、最小値なら先頭、最大値なら末尾の要素を取り出せばいいです。
- ややこしいですが、st.end()より1つ前のイテレータが末尾の要素である点に注意しましょう。
ソースコード
#include <iostream> #include <set> int main() { std::set<int> st{ 3, 4, 2, 6, 3, -1 }; // 先頭及び末尾のイテレータを取得 auto minIte = st.begin(); auto maxIte = st.end(); // 末尾イテレータから1を引かないと末尾要素を取得できない maxIte--; //--maxIte; でも可 // 表示 std::cout << "先頭(最小)の要素は" << *minIte << std::endl; std::cout << "最後(最大)の要素は" << *maxIte << std::endl; }
実行結果
先頭(最小)の要素は-1 最後(最大)の要素は6