2015-03-11 2 views
0

Я хочу создать собственный контейнер данных, например STL-containers.Как использовать компаратор по умолчанию в своем классе?

template <class priorityType = size_t, class Compare = std::less<priorityType>> 
class task_queue 
{ 
public: 
    task_queue(Compare c = Compare()) 
    { 

    } 

private: 
    std::priority_queue<priorityType, std::vector<priorityType>, Compare> tasks_id; 
}; 

int main() { 
    struct foo 
    { 
     int a; 
    }; 

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

    task_queue<foo, foo_compare> queue{ foo_compare() }; 
} 

Я хочу использовать comparator, который передается в конструктор, в tasks_id PQ. Как я могу это сделать?

+0

Если вы передадите оператор сравнения в конструкторе, вы не получите привязку сравнений времени компиляции, т. Е. Ваш код будет менее эффективным. –

+0

@ ErikAlapää, но контейнеры STL используют этот материал таким образом. – Denis

+0

В общем, хороший код на C++, включая STL, пытается использовать привязку времени компиляции, когда это возможно. Это одна из причин, почему std :: sort в C++ быстрее, чем C quicksort. (Сорт C++ использует сопоставления по времени компиляции, в то время как обычная C quicksort использует указатели на функции). –

ответ

2

Просто позвоните по телефону constructor.

task_queue(Compare c = Compare()) : tasks_id(c) 
{ 

} 
+0

FWIW, вот полный пример, который делает именно это: http://ideone.com/fn1jUF –

+0

@ForEveR, а как насчет того, нужен ли 'my_class' в таком компараторе, но нет такой структуры, как PQ? Например, у метода 'my_class' есть метод, который сравнивает его параметры? – Denis

+0

@Denis store 'Compare' объект в классе, в c-tor строит его правильно, используйте его, когда вам нужно. – ForEveR

0

Вам просто нужно вызвать его:

c(valuetocompare1, valuetocompare2); 

Это просто.

Смежные вопросы