如何使用std :: multiset具有多个比较器功能?

时间:2011-04-29 16:23:59

标签: c++ visual-c++ stl

下午好,我有一个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 

2 个答案:

答案 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必须始终保持排序状态。谢谢。