Как использовать std :: multiset с функцией множественного сравнения? - PullRequest
4 голосов
/ 29 апреля 2011

Добрый день, у меня есть класс 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 

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Звучит так, будто вам будет лучше, если вы используете что-то из Boost :: MultiIndex вместо того, чтобы пытаться принудительно использовать несколько различных функций компаратора в std :: multiset.У них есть куча разных типов контейнеров ( см. Здесь .) В частности, я бы посмотрел версии orders_indices .

1 голос
/ 02 мая 2011

Возможно, я нашел обходной путь для нескольких функций компаратора: Вот оно:

Range targetRange = Range (PreviousNCopy, PreviousN, TmpPrevMapPtr);

bool Found = std :: binary_search (range_type.begin (), range_type.end (), targetRange, MyComparator ());

где: MyComparator является структурой: struct MyComparator {
оператор bool () (постоянный диапазон & d1, постоянный диапазон & d2) const {
return d1.getPtr () } };

std :: binary_search занимает o (log n) времени, но std :: multiset range_type всегда должен оставаться отсортированным. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...