【发布时间】:2011-04-29 16:23:59
【问题描述】:
下午好,我有一个 C++ 类 Range,它实现了 operator < 供 std::multiset<Range> ranges_type 使用。
由于多重集构造函数没有指定自定义比较器函子,它使用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
【问题讨论】:
-
我不明白你为什么想要多个比较器。这有什么意义?
std::multiset<Range, PointerCompare>有什么问题? -
另外,请注意您的格式。您应该使用“{}”按钮格式化代码 sn-ps。我已经为你做了这个,但你已经编辑了你的问题并再次打破了它!
-
Oli Charlesworth:我需要使用两个比较器,因为我使用:std::multiset
::const_iterator iter = range_type.lower_bound(Range(n)); if(iter == range_type.end() || iter->low() > n){ found = false;} else{ curr = *iter;找到=真; } -
@Frank:我不确定我是否理解。您是说您希望能够以不同的排序顺序遍历您的多重集吗?这是不可能的(因此您需要找到不同的数据结构)。如果那不是您想要的,那么您所做的就是正确的;即提供自定义比较器作为模板参数。
-
Oli Charlesworth:我需要使用两个比较器,因为我使用:std::multiset
::const_iterator iter = range_type.lower_bound(Range(n)); if(iter == range_type.end() || iter->low() > n){ found = false;} else{ curr = *iter;找到=真; }。我需要使用像这样的第二个比较器 std::multiset ::iterator iter = find(range_types.begin(), range_type.end(),curr); range__type.erase(iter) 。谢谢你 。对于破坏您的编辑,我深表歉意。
标签: c++ visual-c++ stl