簡體   English   中英

STL多集設置插入順序C ++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM