[英]STL multiset setting insertion order C++
我正在使用多重集來存儲有序對象的集合,我正在使用operator <來建立順序標准,但是我做錯了,因為當我遍歷多重集打印跟蹤時,我可以看到它們在以下位置不是有序的全部...。這個問題真的讓我受阻...
我嘗試在這里簡化代碼:
class CellSearch
{
public:
bool operator<(const CellSearch & C) const;
int getF() const { return _G + _H; }
private:
int _G;
int _H;
}
...
bool CellSearch::operator< (const CellSearch& C) const
{
return (this->getF() < C.getF());
}
我聲明多重集的方式是:
std::multiset<CellSearch*> myOpenList;
然后我以這種方式插入一個新元素:
....
CellSearch *actualSearch = new CellSearch(start);
addOpenList(actualSearch, myOpenList);
這是函數:
void Grid::addOpenList(CellSearch* actual, std::multiset<CellSearch*>& openList)
{
openList.insert(actual);
}
我是第一次使用多重集嗎?實際上是我的第一個容器不是向量:)您在這里看到錯誤了嗎?
我試圖總結一下代碼,希望不要太多...
您的多重集正在存儲指向對象的指針 。 結果,為了進行比較,它比較的是指針 ,而不是對象本身。
為了使它以當前形式工作,您需要將對象本身放入多集。 另一個選擇是提供一個自定義比較器進行設置,該比較器將知道要取消對指針的引用並比較實際的對象,但是在這種情況下這是次等的,因為我根本看不到任何存儲指針的理由。
最好將operator <
作為自由函數而不是類成員來實現。
如果您打算在容器中使用指針,則應該這樣做:
template<class KEY>
struct pointer_compare {
bool operator()(const KEY* lhs, const KEY* rhs) const {
return *lhs < *rhs;
}
}
std::multiset<Search*, pointer_compare<Search>> myOpenList
問題在於您不是在使用CellSearch
對象集,而是在使用指向它們的指針,這使得比較器可以使用指針。
這是通用的解決方案,您可以將其重用於其他指針比較:
template<class T>
struct PointerComparator {
bool operator()(const T *a, const T *b) const {
return *a < *b;
}
};
std::multiset<CellSearch*, PointerComparator<CellSearch> > myOpenList;
這樣,您仍然可以為CellSearch
定義operator <
。
您可以這樣定義一個少單元函子:
class cmpCell
{
bool operator()(CellSearch* a, CellSearch* b)
{
return *a < *b;
}
};
然后在聲明多集時使用它:
std::multiset<CellSearch*, cmpCell> myOpenList;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.