是否可以使用比较器函数过滤掉STL多集下界检查的数据

Is it possible to filter out the data examined by STL multiset lower_bound using a comparator function?

本文关键字:检查 数据 STL 可以使 比较器 函数 过滤 是否      更新时间:2023-10-16

我们使用std::multiset ranges_type成员变量来存储Range数据。当我们呼叫时

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))可以返回多个候选Range元素。然而,STL multiset::lower_bound(Range(n)总是选择第一个候选元素。我们想知道是否可以使用比较器函数来控制ranges_type.lower_type(Range(n))返回的候选元素。例如,假设我们只想要一个caseNumber1或caseNumber10的下界答案。然后我们尝试更改类Range运算符<至:

bool operator<(const Range& rhs) const{
    if ((mCaseNumber == 10 || mCaseNumber == 1) &&
    (rhs.mCaseNumber == 10 || rhs.mCaseNumber == 1)){
       return mHigh < rhs.mHigh;
     }
     else {
      return false;
     }
}

不幸的是,这个基元运算符不能正常工作。我们想知道是否可以更改comparator函数,使std::lower_bound只返回CaseNumber为10或Case为1的Range元素,而不返回Case为15的Range元素。我们原来的类范围如下所示。

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 

从std::lower_bound的文档中,作为第三个参数传递的比较函数是一个:

比较函数对象,取两个相同类型的值与包含在该范围内的那些相比,如果第一个参数为true在中的第二个参数之前特定严格弱排序defines,否则为false。

所以,试试这样的东西:

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

并将Range::CustomComparator传递到下界调用