недопустимые операнды для двоичного выражения при перемещении элемента в приоритетную очередь

#c #c 11 #priority-queue #c -standard-library

Вопрос:

Я новичок в программировании на c . Я должен создать приоритетную очередь класса с именем Контейнер. Поэтому я написал так:

В main.cpp:

 struct Comp{
    bool operator() (const Containeramp; a, const Containeramp; b){
        return a<b;
    }
};

std::priority_queue<Container, std::list<Container>, Comp> containers;

 

В Container.cpp:

 class Container{
public:
    friend bool operator< (const Containeramp; a, const Containeramp; b);
    //...
};

bool operator<(const Container amp;a, const Container amp;b) {
    return a.y<b.y;
}

 

Я не знаю, почему, даже если я объявил:

 error: invalid operands to binary expression ('std::__1::__list_iterator<Container, void *>' and 'std::__1::__list_iterator<Container, void *>')
    __sift_up<_Comp_ref>(__first, __last, __comp, __last - __first); 
 

Как я могу это решить ? Я действительно не знаю, что происходит 🙁

Ответ №1:

Это говорит вам о том, что ваш ит не может вычислить разницу между двумя итераторами типа list<Container>::interator .

Если вы посмотрите на требования для priority_queue CppReference, в нем говорится, что итераторы для контейнера «должны удовлетворять требованиям LegacyRandomAccessIterator».

list итераторы s не имеют произвольного доступа; они двунаправленные. Поэтому вы не можете использовать a list в качестве базового контейнера для a priority_queue .

Простое исправление: используйте a deque вместо a list .

std::priority_queue<Container, std::deque<Container>, Comp> containers;