2016-04-05 13 views
-1

注文したオブジェクトのコレクションを格納するためにマルチセットを使用していますが、注文基準を確立するためにオペレータ<を使用していますが、マルチセット印刷を繰り返して、STLマルチセットの設定の挿入順序C++

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); 
} 

多重集合を使用して私の最初の時間が...実際にはベクトルではありません、私の第一の容器です:)あなたは何かここで間違って見ることができますか?

私は、コードをまとめてみました、私はあまりないと思い...

答えて

4

あなたのマルチセットは、ポインタオブジェクトにを記憶しています。その結果、比較のために、オブジェクト自体ではなく、ポインタを比較します。

現在の形式で動作させるには、オブジェクトをマルチセットに入れる必要があります。もう一つのオプションは、ポインタを逆参照して実際のオブジェクトを比較することを知っているカスタムコンパレータを用意することですが、ポインタを格納する理由は全く見当たらないので、この場合は劣ります。

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 
+0

はアドバイスをありがとうございました!! :)とにかく、オブジェクトを比較するためにポインタを逆参照する方法を例に挙げてください。 – Breikdans

+0

@Breikdans - 完了しましたが、私はそれに対して本当に助言します。 – SergeyA

+0

ありがとうございます!私はポインタを格納しないという選択肢を検討しますが、mwがそれを逆参照ポインターと比較する方法も学ぶのは非常に面白かったです:) – Breikdans

1

問題は、あなたがCellSearchオブジェクトのセットではない作業しているということですが、それらへのポインタコンパレータはポインタで動作します。

template<class T> 
struct PointerComparator { 
    bool operator()(const T *a, const T *b) const { 
     return *a < *b; 
    } 
}; 

std::multiset<CellSearch*, PointerComparator<CellSearch> > myOpenList; 

この方法であなたはまだoperator <CellSearchのために定義されている:

は、ここでは、他のポインタの比較のために再利用することができ、一般的なソリューションです。

+0

ありがとうございました! – Breikdans

0

あなたは、このような電池レスファンクタ定義することができます。

class cmpCell 
{ 
    bool operator()(CellSearch* a, CellSearch* b) 
    { 
     return *a < *b; 
    } 
}; 

をそして、多重集合を宣言するときにそれを使用します。

std::multiset<CellSearch*, cmpCell> myOpenList; 
関連する問題