私たちは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
に
とRANGEを渡す:: CustomComparatorあなたは、コンストラクタであなたのコンパレータ機能へのポインタを渡してみましたか?ここをクリックしてください:http://www.cplusplus.com/reference/stl/multiset/multiset/ –
@Dario_Ramos、はい、私たちはコンパレータ関数を作成しようとしましたstd :: lower_bound(ranges_type.begin()、ranges_type.end() 、レンジ(n)、コンパレータ())。悲しいかな、私たちは正しい答えを得ることはありません(つまり、caseNumber = 10または1)。多分、私たちの比較ファンクタは間違っています。コンパレータのファンクタが好きなようなアイデアはありますか?私たちはSTL :: multiset :: equal_rangeを試しています。それが助けになると思いますか?ご協力ありがとうございました。 – Frank
私は、イテレータのコンストラクタではなく、マルチセットのコンストラクタを意味しました。とにかく、コンパレータ機能が呼び出されている(つまりデバッグ中)ことをチェックしましたか? –