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