下午好,我有一个C ++类Range
,它实现operator <
以供std::multiset<Range> ranges_type
使用。
由于multiset构造函数未指定自定义比较器仿函数,因此它使用std::less operator <
。
但是,我需要为std::multiset ranges_type
使用第二个比较器函子。具体来说,我会指定第二个比较器:
std::multiset<Range, PointerCompare>
其中struct PointerCompare
看起来是这样的:
struct PointerCompare{
bool operator()(const Range& a, const Range& b) const {
return (a.mPtr == b.mPtr)
}
是否可以将std:multiset
与多个比较器功能一起使用,或者是否有解决方法?谢谢
班级Range
看起来像这样:
class Range {
public:
explicit Range(int item){
mLow = item;
mHigh = item;
mPtr = 0;
}
Range(int low, int high, char* ptr = 0,char* mapptr = 0){
mLow = low;
mHigh = high;
mPtr = ptr;
}
Range(void){
mLow = 0;
mHigh = 0;
mPtr = 0;
}
Range(const Range& r):
mLow(r.mLow),
mHigh(r.mHigh),
mPtr(r.mPtr)
{
}
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; }
private:
int mLow;
int mHigh;
char* mPtr;
}; // class Range
答案 0 :(得分:4)
如果您使用Boost::MultiIndex中的某些内容而不是尝试将多个不同的比较器函数强制转换为std :: multiset,那么听起来就好了。他们有许多不同的容器类型(see here。)特别是我会查看ordered_indices版本。
答案 1 :(得分:1)
我可能找到了多个比较器函数的解决方法:这里是:
范围targetRange =范围(PreviousNCopy,PreviousN,TmpPrevMapPtr);
bool Found = std :: binary_search(ranges_type.begin(),ranges_type.end(), targetRange,MyComparator());
其中:MyComparator是一个结构:
struct MyComparator {
bool operator()(const Range&amp; d1,const Range&amp; d2)const
{
return d1.getPtr()&lt; d2.getPtr();
}
};
std :: binary_search需要o(log n)时间,但std :: multiset ranges_type必须始终保持排序状态。谢谢。