приоритетная очередь с контейнером списка

0

Я пытаюсь использовать список в качестве основного контейнера для очереди приоритетов, в которой хранятся объекты datanode. Кажется, что он отлично работает с использованием вектора или deque, но я пытаюсь использовать список в качестве основного контейнера, и я пытаюсь нажать что-то в очередь, я получаю ошибку:

Ошибка 3 ошибки C2784: "неизвестный тип std :: operator - (std :: move_iterator <_RanIt> &, const std :: move_iterator <_RanIt2> &) ': не удалось вывести аргумент шаблона для' std :: move_iterator <_RanIt> & 'from' std :: _ List_unchecked_iterator >> '

struct datanode{
    int depth;
    int cost;
    const int SIZE = 10;
    int ident[9];   
    int parent;
    datanode(int dep, int id[9], int);
    datanode(int dep, int id[9], int, int);
    datanode(const datanode&);
    datanode(); 
    datanode& datanode::operator=(const datanode&);
};

class NodeComparison
{
  public:
    bool operator() (datanode& da, datanode& db)
    {
        return da.cost > db.cost;
    }
};

int main(){
    std::priority_queue<datanode,list<datanode>, NodeComparison> PQueue;
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    datanode d(0,a,0);
    PQueue.push(d);
 }
  • 0
    Теоретически вы можете создать файл priority_queue, который будет использовать список в качестве основного хранилища, но производительность будет довольно низкой. В priority_queue узел с индексом N имеет дочерние элементы с индексами 2N и 2N + 1, поэтому обход от этого узла N обычно переходит к одному из узлов 2N или 2N + 1. Вы можете использовать std::advance для доступа к этим узлам, но то, что вы обычно ожидаете от операций постоянной сложности, станет линейным, поэтому операции O (N log N) в конечном итоге будут выглядеть как O (N * N) , теряя большинство причин использовать приоритетную очередь для начала.
  • 0
    Чтобы быть правильным, NodeComparison::operator() должен быть как const, так и принимать параметры const.
Теги:
list
priority-queue

1 ответ

7

§23.6.4 [priority.queue]/p1:

Любой контейнер последовательности с итератором произвольного доступа и поддерживающими операциями front(), push_back() и pop_back() может использоваться для создания экземпляра priority_queue.

std::list нет итераторов произвольного доступа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню