У меня есть класс, и указатели на объекты этого класса нужно поместить в std::set
. Я хочу определить компаратор внутри класса. Я видел несколько решений, в которых либо определяется отдельный класс (наверное, он называется функтором), либо определяется структура, которая перегружает класс operator()
. Я хочу избежать этого шаблонного кода и хочу определить компаратор как член самого класса, что-то вроде метода compareTo()
в Java.
Скажем, мой класс выглядит примерно так:
class Item {
private:
int id;
float score;
.....
public:
// Rest of the methods and setters/getters
}
Я хочу определить компаратор таким образом, чтобы указатель на объект с более высокой оценкой помещался первым в наборе. Если количество очков у обоих одинаковое, то первым ставится тот, у кого id меньше. Я предполагаю, что код будет примерно таким, но, поскольку я не очень хорошо понял эту часть, пожалуйста, поправьте меня (я бы хотел, чтобы это было размещено внутри самого класса):
bool operator()(const Item* a, const Item* b) {
if (a->score != b->score) return a->score > b->score;
return a->id < b->id;
}
Использование будет следующим:
std::set<Item*> sortedItems;
Item* item = new Item();
sortedItems.insert(item);
Я не уверен, нужно ли вообще указывать компаратор в шаблоне std::set
, если он определен в классе, и если да, то как? Кроме того, как добавить этот компаратор в сам класс? Я новичок в STL и довольно новичок в C++. Спасибо!
operator<
для элемента. - person andre   schedule 11.10.2012operator<
определено, мне не нужно будет указывать какой-либо компаратор дляstd::set
? Я используюset
указателей наItem
, а не сами объекты. Спасибо за ваш ответ! - person Paresh   schedule 11.10.2012ptrOrder<T>
, который заказывает дваT*
, используяstd::less<T>
, который, в свою очередь, по умолчанию равенoperator<(T, T)
. Это может быть полезно, если у вашегоItem
уже есть работающиеoperator<
иstd::less<Item>
. - person MSalters   schedule 11.10.2012Item
их нет, достаточно будет и простого написания компаратора. - person Paresh   schedule 11.10.2012new
очень не соответствует C++, потому что обработка времени жизни подвержена ошибкам. Современный стиль C++ заключается в использовании интеллектуальных указателей или каких-либо дескрипторов. И вы можете перегрузитьoperator<
для них, потому что они являются типами классов. - person Jan Hudec   schedule 11.10.2012operator<
радиstd::shared_ptr
. В каком пространстве имен вы бы это сделали? Помните, чтоstd::set
должен его найти, и вы не можете добавлять перегрузки кnamespace std
. - person MSalters   schedule 12.10.2012