std::setで自作の型を使う

方法1 operator<()を実装する

以下の例のように、MyClass::operator<()を実装すればOK。

#include <set>
#include <iostream>
#include <string>

class MyClass {
public:
    MyClass(int num) :
        num_(num)
    {}

    std::string toString() const {
        return std::to_string(num_);
    }

    bool operator<(const MyClass& rhs) const {
        return num_ < rhs.num_;
    }

private:
    int num_;
};

int main() {
    std::set<MyClass> mySet;
    MyClass obj1(1);
    MyClass obj2(2);
    MyClass obj3(3);

    mySet.insert(obj1);
    mySet.insert(obj3);
    mySet.insert(obj2);

    for(const MyClass& obj : mySet) {
        std::cout << obj.toString() << std::endl;
    }

    return 0;
}

方法2 比較用の型を追加する

自作の型を比較する型(以下の例だと、MyClass::Compare)を追加して、それをstd::setに渡せばOK。

#include <set>
#include <iostream>
#include <string>

class MyClass {
public:
    MyClass(int num) :
        num_(num)
    {}

    std::string toString() const {
        return std::to_string(num_);
    }

    struct Compare {
      size_t operator()(const MyClass& a, const MyClass& b) const {
          return a.num_ < b.num_;
      }
    };

private:
    int num_;
};

int main() {
    std::set<MyClass, MyClass::Compare> mySet;
    MyClass obj1(1);
    MyClass obj2(2);
    MyClass obj3(3);

    mySet.insert(obj1);
    mySet.insert(obj3);
    mySet.insert(obj2);

    for(const MyClass& obj : mySet) {
        std::cout << obj.toString() << std::endl;
    }

    return 0;
}

実行結果

1
2
3