Я работаю над алгоритмом поиска пути и хочу реализовать приоритетную очередь, чтобы ускорить его.
Я добавляю свой объект Node
в очередь на основе свойства fScore
. Самый маленький fScore
всегда добавляется в начало очереди.
Какие у меня для этого есть варианты? Было бы лучше реализовать очередь приоритетов c ++ с помощью stl? Если да, то как мне настроить это, чтобы он принимал мой объект objective-c Node
, и как мне указать, для чего упорядочивается список (Node.fScore
).
Благодарность
1 ответ
Для std:: priority_queue
, если вы используете ARC, вы должны пройти 90% пути. Контейнер STL будет автоматически хранить сильные ссылки. ВЫИГРАТЬ!
Вам нужно будет создать собственный класс сравнения.
typedef std::priority_queue<MyClass *, std::vector<MyClass *>, MyClassCompare> MyPriorityQueue;
Я не совсем уверен, как вы захотите реализовать свой класс сравнения. Это будет выглядеть примерно так:
class MyClassCompare {
bool operator()(MyClass *lhs, MyClass *rhs) const {
// magic!!! Be sure to return a bool.
}
};
Пример класса оболочки
MyClassQueue.h
@interface MyClassQueue : NSObject
@property (nonatomic, readonly) MyClass *topObject;
@property (nonatomic, readonly) NSUInteger count;
- (void)pushObject:(MyClass *)myObject;
- (void)popObject;
- (void)popAllObjects;
@end
MyClassQueue.mm
#import "MyClassQueue.h"
#include <queue>
#import "MyClass.h"
class MyClassCompare {
bool operator()(MyClass *lhs, MyClass *rhs) const {
// magic!!! Be sure to return a bool.
}
};
typedef std::priority_queue<MyClass *, std::vector<MyClass *>, MyClassCompare> MyPriorityQueue;
@interface MyClassQueue ()
@property (nonatomic) MyPriorityQueue *queue;
@end
@implementation MyClassQueue
- (MyClass *)topObject {
return !self.queue->empty() ? self.queue->top() : nil;
}
- (NSUInteger)count {
return (NSUInteger)self.queue->size();
}
- (void)pushObject:(MyClass *)myObject {
self.queue->push(myObject);
}
- (void)popObject {
if (!self.queue->empty()) {
self.queue->pop();
}
}
- (void)popAllObjects {
if (!self.queue->empty()) {
delete _queue;
_queue = new MyPriorityQueue();
}
}
- (instancetype)init {
self = [super init];
if (self != nil) {
_queue = new MyPriorityQueue();
}
return self;
}
- (void)dealloc {
delete _queue;
_queue = NULL;
}
@end
#import "queue"
. Я бы использовал #include <queue>
. Что касается typedef и класса compare, вам действительно решать, как вы хотите организовать вещи. Я бы обернул их в класс Objective C, чтобы ограничить количество необходимых файлов .mm.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
std::priority_queue
не удовлетворит ваши потребности, поскольку он не обеспечивает функции изменения приоритета, как это делает boost heap.