Можно ли отфильтровать данные, проверенные мультимножеством STL lower_bound, используя функцию компаратора? - PullRequest
1 голос
/ 23 июня 2011

Мы используем переменную-член 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);
}

Существует несколько возможных элементов Range, которые ranges_type.lower_bound(Range(n)) может вернуть. Однако STL multiset::lower_bound(Range(n) всегда выбирает первый элемент-кандидат. Мы хотели бы знать, можем ли мы использовать функцию сравнения для управления элементом-кандидатом, возвращаемым ranges_type.lower_type(Range(n)). Например, предположим, что мы хотели бы получить только ответ нижнего связывания с caseNumber 1 или case Number 10. Затем мы попытались изменить оператор класса Range <на: </p>

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 возвращал только элемент Range с CaseNumber 10 или Case 1, но не возвращал элемент Range с регистром 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 

1 Ответ

1 голос
/ 23 июня 2011

Из документации std :: lower_bound , функция сравнения, которую вы передаете в качестве третьего аргумента, представляет собой:

Функция сравнения объекта, принимая два значения одного типа чем те, которые содержатся в ассортименте, возвращает true, если первый аргумент идет перед вторым аргументом в конкретный строгий слабый порядок определяет, и ложь в противном случае.

Итак, попробуйте что-то вроде этого:

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

И передать Range :: CustomComparator на вызов lower_bound

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...