次の問題があります: この (簡略化された) 構造を考えてみましょう:
struct Task {
int priority;
std::string description;
// Some other fields
};
今、私はすべてのタスクのセットを持ち、それを使っていくつかの作業をしたいと思っています. したがって、すべての要素が等しいことを確認する等価演算子があります。
bool isEqual(const Task& lhs, const Task& rhs) {
return lhs.priority == rhs.priority &&
lhs.description == rhs.description &&
// Some other fields
;
}
このために、正常に機能する std::unordered_set を使用しました。
しかし今、これらのタスクを優先度順に並べ替えて(最も優先度の高いタスクを取得するために)セットに入れたいと思っています。明らかに、これは std::unordered_set では不可能なので、次の less 演算子を使用して std::set を試しました。
bool lessTask(const Task& lhs, const Task& rhs) {
return lhs.priority < rhs.priority;
}
しかし、これは厳密な弱い順序付けによって、優先度が等しい場合に2つのタスクが等しいことを意味します。これは望ましくありません(同等性チェックのために isEqual メソッドを維持したい)。
一連のタスクを達成するための最良の方法は何ですか?要素を非常に高速に挿入でき、重複するエントリ (私の isEqual 関数で定義) がなく、優先度が最も高いタスクを非常に高速に取得できますか?
私は特定のSTLコンテナに縛られていませんが、サードパーティのライブラリを使用したくありません(ブーストさえも)。