std :: make_heap with pairs

时间:2010-11-09 16:10:53

标签: c++ data-structures std-pair

是否可以在向量中使用make_heap()对吗?

我正在使用:

 std::vector< std::pair < int , tablero& > > lista_abierta_;

我使用object函数按第一个成员对该对进行排序,但它崩溃了。

代码是:

#include <iostream>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <functional>
#include "8_puzzle.h"
#include "tablero.h"

using namespace std;

class comp {
public:
    bool operator()(pair < int, tablero&> a, pair < int, tablero&> b) const {
        return a.first > b.first;
    }
};

pair < int, tablero& > puzzle::A_estrella::tope()
{
    pair < int, tablero& > l=lista_abierta_.front();

    pop_heap(lista_abierta_.begin(),lista_abierta_.end());
    lista_abierta_.pop_back();

    return l;
}

[摘自here]

3 个答案:

答案 0 :(得分:1)

只要std::pair<T, U>提供operator<(意思是:TU提供operator<),我就不会在使用make_heap时遇到任何问题。

答案 1 :(得分:0)

只要std::make_heap<T>提供T或明确传递比较器,您就可以致电bool operator<(const T &, const T &)

您必须从

更改第23行
pop_heap(lista_abierta_.begin(),lista_abierta_.end());

pop_heap(lista_abierta_.begin(),lista_abierta_.end(), comp());

答案 2 :(得分:0)

问题是像pair < int, tablero& >这样的引用在make_heap / pop_heap中进行复制的情况下将不起作用。要解决此问题,我们需要pair<int, std::reference_wrapper<tablero> >comp和其他实现需要相应地更改。

class comp {
public:
    bool operator()(pair < int, std::reference_wrapper<tablero> > a, pair < int, std::reference_wrapper<tablero> > b) const {
        return a.first > b.first;
    }
};

heap_popmake_heap将需要一个Compare对象。

comp mycomp;
pop_heap(lista_abierta_.begin(),lista_abierta_.end(),mycomp);