簡體   English   中英

是否可以使用比較器功能過濾掉STL multiset lower_bound檢查的數據?

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

我們使用一個std :: multiset range_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))返回的候選元素。示例假設我們只需要一個caseNumber 1或case Number 10的Lower_bound答案,然后我們嘗試將Range 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;
     }
}

不幸的是,該原始運算符無法正常運行。 我們想知道是否有可能更改比較器函數,以便std :: lower_bound僅返回CaseNumber為10或Case 1的Range元素,而不返回情況為15的Range元素。我們的原始類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,否則返回false。

因此,嘗試這樣的事情:

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

並將Range :: CustomComparator傳遞給lower_bound調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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