2011-06-23 14 views
1

私たちはRangeデータを格納するためにstd :: multiset ranges_typeメンバー変数を使用しています。我々はコンパレータ機能を使用してSTLマルチセットlower_boundで調べたデータをフィルタリングすることは可能ですか?

std::multiset<Range>::const_iterator iter = ranges_type.lower_bound(Range(n)); 
if (iter == ranges_type.end() || iter->low() > n){  
    found = false; 
} 
else{ 
    curr = *(iter); 
} 

を呼び出すとranges_type.lower_bound(Range(n))を返すことができ、複数の候補範囲の要素があります。ただし、STL multiset::lower_bound(Range(n)は常に最初の候補要素を選択しています。 ranges_type.lower_type(Range(n))によって返される候補要素を制御するためにコンパレータ関数を使用できるかどうかを知りたいと思います。たとえばに、我々は唯一のcaseNumber 1またはケース番号10とLOWER_BOUNDの答えはその後、我々はクラスの範囲演算子<を変更しようとしたのだろうと仮定します

bool operator<(const Range& rhs) const{ 
    if ((mCaseNumber == 10 || mCaseNumber == 1) && 
    (rhs.mCaseNumber == 10 || rhs.mCaseNumber == 1)){ 
     return mHigh < rhs.mHigh; 
    } 
    else { 
     return false; 
    } 
} 
残念ながら、この原始的なオペレータは正常に機能しませんでした。 std :: lower_boundがCaseNumber 10またはCase 1のRange要素を返すだけでなく、Range要素をcase 15で返さないようにコンパレータ関数を変更できるかどうか疑問に思っていました。元のクラスのRangeを以下に示します。 std::lower_bound's documentationから

class Range { 
    public: 
     explicit Range(int item){ 
      mLow = item; 
      mHigh = item; 
      mPtr = 0; 
      mMapPtr = 0; 
      mStamp = 0; 
      mCaseNumber = 100; 
      mCurrentN = 0; 
     } 
     Range(int low, int high, char* ptr = 0,char* mapptr = 0, int stamp = 0, 
       int casenumber = 100, int currN = 0,int currMappedLength = 0){ 
      mLow = low; 
      mHigh = high; 
      mPtr = ptr; 
      mMapPtr = mapptr; 
          mStamp = stamp; 
      mCaseNumber = casenumber; 
      mCurrentN = currN; 
          mMappedLength = currMappedLength;   
     } 
     Range(void){ 
      mLow = 0; 
      mHigh = 0; 
      mPtr = 0; 
      mMapPtr = 0; 
          mStamp = 0; 
      mCaseNumber = 100; 
      mCurrentN = 0; 
     } 

     Range(const Range& r): 
      mLow(r.mLow), 
      mHigh(r.mHigh), 
      mPtr(r.mPtr), 
      mMapPtr(r.mMapPtr), 
      mStamp(r.mStamp), 
      mCaseNumber(r.mCaseNumber), 
      mCurrentN(r.mCurrentN), 
          mMappedLength(r.mMappedLength) 
     { 
     } 

     ~Range(){ 
     } 


     bool operator==(const Range& rhs) const{ 
      return (mLow <= rhs.mLow && mHigh >= rhs.mHigh); 
     } 
     bool operator<(const Range& rhs) const{ 
       return mHigh < rhs.mHigh; 
     } 
     int low() const { return mLow; } 
     int high() const { return mHigh; } 
     char* getPtr() const { return mPtr; } 
     char* getMapPtr() const { return mMapPtr; } 
     int getStamp() const { return mStamp; } 
     int getCaseNumber() const { return mCaseNumber; } 
       int getMappedLength() const { return mMappedLength; } 
    private: 
     int mLow; 
     int mHigh; 
     char* mPtr; 
     char* mMapPtr; 
     int mStamp; 
     int mCaseNumber; 
     int mCurrentN; 
     int mMappedLength; 
}; // class Range 
+0

bool Range::CustomComparator(const Range& lhs, const Range& rhs){//declare it static //Your logic here } 

とRANGEを渡す:: CustomComparatorあなたは、コンストラクタであなたのコンパレータ機能へのポインタを渡してみましたか?ここをクリックしてください:http://www.cplusplus.com/reference/stl/multiset/multiset/ –

+0

@Dario_Ramos、はい、私たちはコンパレータ関数を作成しようとしましたstd :: lower_bound(ranges_type.begin()、ranges_type.end() 、レンジ(n)、コンパレータ())。悲しいかな、私たちは正しい答えを得ることはありません(つまり、caseNumber = 10または1)。多分、私たちの比較ファンクタは間違っています。コンパレータのファンクタが好きなようなアイデアはありますか?私たちはSTL :: multiset :: equal_rangeを試しています。それが助けになると思いますか?ご協力ありがとうございました。 – Frank

+0

私は、イテレータのコンストラクタではなく、マルチセットのコンストラクタを意味しました。とにかく、コンパレータ機能が呼び出されている(つまりデバッグ中)ことをチェックしましたか? –

答えて

1

、あなたが3番目の引数として渡す比較関数は、次のとおり 範囲に含まれるものと同じタイプ の2つの値をとり、

比較関数オブジェクト、 最初の引数 が の特定の厳密な弱い順序付けの第2引数の前にある場合はtrueを返します。 が定義されていれば、trueを返します。

ので、このような何かしてみてください:LOWER_BOUNDコール

+1

そしてそれが依然として厳しい弱い注文であることを確かめてください。 –

+0

@dario_ramos、ありがとうございます。 STL :: multiset マルチセットはRange(n)に対応する複数のRange要素候補を持っているため、std :: equal_rangeを試しています。 lower_boundコンパレータは複数の候補をどのように扱いますか?カスタムコンパレータがケース番号1と10だけを扱い、ケース15は扱わないことを私たちに示すことは可能ですか?ご協力ありがとうございました。 – Frank

+0

@Tomalak Geret'kal、厳格な弱い発注について返信いただきありがとうございます。ここに私たちのコンパレータ関数があります:struct Comparator {int Offset;コンパレータ(int N){オフセット= N; (d1.getCaseNumber()== 10 || d1.getCaseNumber()== 1)&&(d2.getCaseNumber()== 10 || bool operator()(const Range&d1、const Range&d2)const {if d2.high()&&(d1.low()> = Offset && d1.high()> Offset)&&(d2.low()== 1){return d1.high() – Frank

関連する問題