Я работаю над алгоритмом поиска пути и хочу реализовать приоритетную очередь, чтобы ускорить его.

Я добавляю свой объект Node в очередь на основе свойства fScore. Самый маленький fScore всегда добавляется в начало очереди.

Какие у меня для этого есть варианты? Было бы лучше реализовать очередь приоритетов c ++ с помощью stl? Если да, то как мне настроить это, чтобы он принимал мой объект objective-c Node, и как мне указать, для чего упорядочивается список (Node.fScore).

Благодарность

1
dev6546 29 Дек 2013 в 04:32
Я не уверен, работает ли boost с Objective-C ++ (я никогда не работал с Objective-C ++), но у них есть очередь с хорошим приоритетом, она же куча. Я полагаю, что std::priority_queue не удовлетворит ваши потребности, поскольку он не обеспечивает функции изменения приоритета, как это делает boost heap.
 – 
leemes
29 Дек 2013 в 04:36
Я на 99% уверен, что boost работает с Objective-C ++, на самом деле любая библиотека C ++ должна работать с Objective-C ++. Поэтому, если OP специально не хочет реализовать свое собственное решение, я считаю это лучшим ответом.
 – 
TheAmateurProgrammer
29 Дек 2013 в 05:01
Спасибо, посмотрю.
 – 
dev6546
29 Дек 2013 в 05:22

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
5
Community 20 Июн 2020 в 12:12
Спасибо за это, я реализовал этот класс для проверки размера моих значений следующим образом: return lhs.fScore> rhs.fScore; Мой единственный вопрос: где мне определить этот typedef, я пытался изменить свой файл .m на .mm и добавить его в разные места в заголовке, но он все равно не компилируется. Извините, если это основной вопрос, но я никогда не делал этого раньше, и все примеры относятся к разным компиляторам llvm.
 – 
dev6546
29 Дек 2013 в 21:37
Я добавил #import "queue", но он все еще не может найти мой собственный класс, нужно ли его определять где-то в частности?
 – 
dev6546
29 Дек 2013 в 21:42
Я не уверен насчет #import "queue". Я бы использовал #include <queue>. Что касается typedef и класса compare, вам действительно решать, как вы хотите организовать вещи. Я бы обернул их в класс Objective C, чтобы ограничить количество необходимых файлов .mm.
 – 
Jeffery Thomas
29 Дек 2013 в 23:22
Спасибо за это, я предполагаю, что файл должен быть установлен как objective-c ++?
 – 
dev6546
29 Дек 2013 в 23:54