Как инициализировать компаратор std :: set? - PullRequest
1 голос
/ 24 сентября 2010

Мне нужно инициализировать некоторый компаратор нового типа данных TType на основе std :: set с некоторым объектом o другого класса Object:

typedef std::set <unsigned int, sortSet(o)> TType

Это объявление вне класса (в заголовочном файле). На момент объявления этот объект не должен существовать, он будет создан позже.

class sortSet
{
   private:
      Object o;

   public:
      sortSet(Object &oo): o(oo) {}
      bool operator() ( const unsigned int &i1, const unsigned int &i2 ) const
      {
         //Some code...
      }
};

Если бы объявление было внутри какого-то метода (когда объект уже создан), ситуация была бы довольно простой ... Что я могу сделать?

Ответы [ 2 ]

3 голосов
/ 24 сентября 2010

Параметр шаблона должен быть типом компаратора, а не конкретным объектом этого типа; Вы можете указать конкретный объект компаратора для использования в конструкторе std::set:

typedef std::set<unsigned int, sortSet> TType;

Object o;
TType mySet(sortSet(o));
1 голос
/ 24 сентября 2010

Я не уверен, что понял ваш фактический вопрос, однако общая идиома использования пользовательского компаратора показана в следующем надуманном примере.

#include <set>

class foo {
  public:
    int i_;
};

struct foo_comparator {
    bool operator()( foo const & lhs, foo const & rhs ) {
        return lhs.i_ < rhs.i_;
    }
};

typedef std::set< foo, foo_comparator > foo_set;

int main() {
  foo_set my_foo_set;
}
...