2010-11-09 5 views
1

Est-il possible de faire make_heap() avec une paire dans un vecteur?std :: make_heap avec des paires

J'utilise:

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

utiliser la fonction d'objet pour commander la paire par le premier membre, mais il se bloque.

Le code est:

#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; 
} 

[Extrait du here]

+1

Salut NSB, bienvenue à débordement de la pile. S'il vous plaît essayez de formater votre message selon le [guide de formatage] (http://stackoverflow.com/editing-help). Merci. – jpjacobs

+1

Vous ne pouvez pas avoir une paire qui contient une référence à l'intérieur d'un conteneur standard, n'est-ce pas? –

Répondre

1

Tant que std::pair<T, U> fournit operator< (ce qui signifie: T et U fournissent operator<), je ne vois pas de problème dans l'utilisation make_heap .

0

Vous pouvez appeler std::make_heap<T> tant que T fournit bool operator<(const T &, const T &) ou vous passez explicitement le comparateur.

Vous devez changer la ligne 23 de

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

à

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