是否可以使用比较器函数过滤掉STL多集下界检查的数据
Is it possible to filter out the data examined by STL multiset lower_bound using a comparator function?
我们使用std::multiset ranges_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))
返回的候选元素。例如,假设我们只想要一个caseNumber1或caseNumber10的下界答案。然后我们尝试更改类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;
}
}
不幸的是,这个基元运算符不能正常工作。我们想知道是否可以更改comparator函数,使std::lower_bound只返回CaseNumber为10或Case为1的Range元素,而不返回Case为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
从std::lower_bound的文档中,作为第三个参数传递的比较函数是一个:
比较函数对象,取两个相同类型的值与包含在该范围内的那些相比,如果第一个参数为true在中的第二个参数之前特定严格弱排序defines,否则为false。
所以,试试这样的东西:
bool Range::CustomComparator( const Range& lhs, const Range& rhs ){//declare it static
//Your logic here
}
并将Range::CustomComparator传递到下界调用
相关文章:
- 检查串行端口Linux中是否有传入数据(cbInQue for linux)
- 检查输入 std::array 指针数据是否等于某个常量数组
- C++ - 使用用户输入的字符串数据检查结构字符串数据(无限执行 while 循环)
- 如何在 CPP 中检查给定输入的数据类型?
- C++ - 检查结构数据类型中的单词是否为回文
- BoostSpirit.Qi-针对原始数据类型进行边界检查
- 如何使客户端在将数据写入 C++ 管道之前检查服务器是否完成了从管道的读取操作
- 输入数据类型检查循环未按预期工作 (C++)
- 是否可以检查存储在堆栈上的单词是否是回文,而C++中没有任何附加数据结构
- 家庭作业帮助 - 检查表单按钮上的数据
- 避免在统计数据和重命名之间进行TOCTOU(检查时间,使用时间)
- 尝试使用while循环从文件中读取数据.还必须检查以确保第一个和唯一的值不是-1
- C 检查数据是否已指定字符串
- C++ 检查 cin 的输入是否正确数据
- 在编译时检查特征类型保存的数据在内存中是否连续
- C++ 检查数据是否相等
- 检查数据是否正常到达
- 如何在C++中检查数据类型
- 如何检查数据是否插入剪贴板是从PrintScreen
- 如何检查数据类型是否为数组?(c++)