===自作クラス=== クラスを自作する必要がある際に考えること unordered_map などの key に使う際には 'operator==' と hash 関数のオーバーロードが,\\ ordered なコンテナの key に使う際には'operator<' のオーバーロードが必要 例えば int と double をもつクラスをキーとして使う場合は, #ifndef MYCLASS_HPP #define MYCLASS_HPP #include #include class MyClass { public : int var1; double var2; bool operator==(const MyClass &rhs) const; bool operator<(const MyClass &rhs) const; friend std::size_t hash_value(const MyClass &obj) { std::size_t h = 0; boost::hash_combine(h, obj.var1); boost::hash_combine(h, obj.var2); return h; } }; #endif #include "MyClass.hpp" bool MyClass::operator==(const MYClass &rhs) const { return var1 == rhs.var1 && var2 == rhs.var2; } bool MyClass::operator<(const MyClass &rhs) const { if ( var1 != rhs.var1 ) return var1 < rhs.var1; return var2 < rhs.var2 } また,デバッグなどでクラスの中身を見たい場合に出力ストリームをオーバーロードしておくと便利.\\ 自分は使わなかったが,入力ストリームをオーバーロードすれば,テキストファイルから一括で入力することも可能になる気がする.\\ 実際に使ってみたらできた.\\ 入出力ストリームの例は以下の通り. #ifndef MYCLASS_HPP #define MYCLASS_HPP #include class MyClass { public : int var1; double var2; friend std::ostream &operator<<(std::ostream &os, const MyClass &obj); friend std::istream &operator>>(std::istream &is, MyClass &obj); }; #include "MyClass.hpp" #include std::ostream &operator<<(std::ostream &os, const MyClass &obj) { os << "Integer value : " << obj.var1 << "\n" << "Double value : " << obj.var2 << "\n"; return os; } std::istream &operator>>(std::istream &is, MyClass &obj) { is >> obj.var1 >> obj.var2; return is; } ''operator=='' を定義したら,どうせ == と != はちょうど逆の出力をする以外ないはずなので\\ 自動的に ''operator!='' も定義してほしい.\\ テンプレートを使うと上手くいくらしく,グローバルなヘッダーに以下を書いておく. template()==std::declval()))> F operator!=(T a, T b) { return !(a==b); }