[英]custom comparator in lower_bound() stl function in c++
[英]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.