【发布时间】:2011-06-23 15:06:47
【问题描述】:
我们使用一个 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 运算符
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 元素,但不返回 case 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
【问题讨论】:
-
您是否尝试过在构造函数中将指针传递给您的比较器函数?见这里:cplusplus.com/reference/stl/multiset/multiset
-
@Dario_Ramos,是的,我们尝试为 std::lower_bound(ranges_type.begin(),ranges_type.end(),Range(n),Comparator()) 创建一个比较器函数。唉,我们并没有得到正确的答案(即 caseNumber = 10 或 1)。也许,我们的比较函子是错误的。您对比较器函子应该如何有任何想法?我们正在尝试 STL::multiset::equal_range。你认为这会有帮助吗?感谢您的帮助。
-
我指的是多重集的构造函数,而不是迭代器的构造函数。无论如何,您是否检查过您的 Comparator 函数是否被调用(即调试)?
-
@Dario_Ramos,如果我们将比较函子传递给多重集的构造函数,那么我们最终会忽略上面显示的 Range bool operator
-
@Darip_Ramos,我们检查并发现我们的 Comparator 函数在调试器中被调用。感谢您的帮助。
标签: c++ linux visual-c++ stl