次のシナリオで並べ替えて維持する必要のあるstd::list<MyObject*> objectList
コンテナがあります。
- 各オブジェクトには、コストを提供する特定のフィールドがあります(たとえば、float値)。そのコスト値は、2つのオブジェクトを浮動小数点数であるかのように比較するために使用されます
- コレクションは順序付け(昇順)する必要があり、新しく挿入された要素の正しい位置をすばやく見つける必要があります。
- (コストの観点から)最も低い要素を削除することが可能であり、いくつかの任意に配置された要素のコストを更新することも可能です。次に、リストは、すでにソートされている性質を利用して、できるだけ早く並べ替える必要があります。
他のstlコンテナ/メカニズムを使用して、3つの動作プロパティを許可できますか?これはヒープによく似ておりmake_heap
、リストを並べ替えるには、を使用するのが良い方法だと思いました。これらのポインターに依存する他のデータ構造がいくつかあるため、ポインターのコンテナーが必要です。
では、ポインターに対応し、指定された型の比較演算子を調べて並べ替えることができる、より優れたコンテナーを選択するにはどうすればよいでしょうか。
明確化:シナリオに最適で、その問題のポインターまたは参照を正常にラップできるstlコンテナーが必要です。(たとえば、std::set
コンテナは良い候補になる可能性があることを簡単に読みましたが、私はそれについての経験がありません)。
以下の回答に基づく現在の実装:
struct SHafleEdgeComparatorFunctor
{
bool operator()(SHEEdge* lhs, SHEEdge* rhs)
{
return (*lhs) < rhs;
}
};
std::multiset<SHEEdge*, SHafleEdgeComparatorFunctor> m_edges;
もちろん、SHEEdge
データ構造にはオーバーロードされた演算子があります。
bool operator<(SHEEdge* rhs)
{
return this->GetCollapseError() < rhs->GetCollapseError();
}