Как инициализировать карту со значением priority_queue в качестве объекта сравнения объекта priority_queue? - PullRequest
1 голос
/ 14 февраля 2011

То, что я хотел бы сделать, это иметь карту, которая отображает целочисленные ключи в приоритетные_символы указателей в структуру, которую я определил, отсортированную с помощью определенной мной функции сравнения.

То есть тип будетчто-то вроде этого,

map<int, priority_queue<object_t*, compare> > my_map;

, где вы можете предположить, что object_t - это моя определенная структура, а сравнение - функция сравнения, возвращающая логическое значение.

Есть ли способ объявить my_map дляимеют ли priority_queues уже инициализированные с помощью функции сравнения?Например, могу ли я объявить это так, чтобы я мог сделать следующее,

my_map[1].push(object_ptr);
my_map[1].push(object_ptr1);

и поверить, что два указателя объекта были правильно упорядочены в priority_queue?

Спасибо

1 Ответ

0 голосов
/ 14 февраля 2011

Что такое «сравнить»? Если это указатель на функцию, вы должны быть очень осторожны, чтобы не использовать его, прежде чем указывать значение, так как сконструированное по умолчанию priority_queue будет использовать нулевой указатель. Самый простой способ обеспечить ненулевые указатели - если вы не можете переписать или перенести, как показано ниже - это, по иронии судьбы, никогда не использовать оператор индекса; вместо этого используйте методы поиска и вставки.

Если вместо «сравнить» используется функтор, его следует записать так, чтобы его конструкция по умолчанию выполняла именно то, что нужно (часто ничего), - очень редко это невозможно.

Когда компаратор в priority_queue имеет правильное значение (например, не пустой указатель в случае указателя), вы можете быть уверены, что ваши объекты будут упорядочены правильно.


Если у вас есть фиксированная функция и вы используете указатели функций:

bool my_compare(object_t *a, object_t *b) {
  // do something
}
typedef bool (*compare)(object_t*, object_t*);

Переписать на:

struct compare {
  bool operator()(object_t *a, object_t *b) {
    // do something
  }
};

Если вы не можете переписать функцию для сравнения (например, из какой-то сторонней библиотеки), вы можете обернуть (фиксированный) указатель на функцию в компараторе:

bool my_compare(object_t*, object_t*);
struct compare {
  bool operator()(object_t *a, object_t *b) {
    return my_compare(a, b);
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...