パープルハット

※当サイトではGoogleアドセンス広告を利用しています

C++ setの使い方(追加・削除、検索、for文など)



setとは?

  • setは順序付き集合と呼ばれ、重複を許さず、昇順に並ぶという特徴があります。
  • ↓↓本記事で参考にしたサイト

c++ setとmap #C++ - Qiita
C++ のセットに要素が存在するかどうかを確認する

宣言

  • #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