Я пытаюсь использовать список в качестве основного контейнера для очереди приоритетов, в которой хранятся объекты 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);
}
§23.6.4 [priority.queue]/p1:
Любой контейнер последовательности с итератором произвольного доступа и поддерживающими операциями
front()
,push_back()
иpop_back()
может использоваться для создания экземпляраpriority_queue
.
std::list
нет итераторов произвольного доступа.
std::advance
для доступа к этим узлам, но то, что вы обычно ожидаете от операций постоянной сложности, станет линейным, поэтому операции O (N log N) в конечном итоге будут выглядеть как O (N * N) , теряя большинство причин использовать приоритетную очередь для начала.NodeComparison::operator()
должен быть как const, так и принимать параметры const.