Frage

Ich versuche, einen Paarwert in eine Karte einzufügen. Die Mai -Karte wird durch ein Objekt und einen Vektor eines anderen Objekts komponiert. Ich weiß nicht warum, aber der einzige Weg, den Code zum Kompilieren zu erstellen, besteht darin, das erste Objekt wie einen Zeiger zu deklarieren. Wenn ich jedoch ein Objekt einfüge, wird nur das erste Paar in die Karte eingefügt.

Meine Karte lautet:

map<prmEdge,vector<prmNode> > archi;

Dies ist der Code:

{

bool prmPlanner::insert_edge(int from,int to,int h) {

prmEdge e; 
int f=from; 
int t=to; 
if(to<from){
    f=to;
    t=from; 
} 

e.setFrom(f);
e.setTo(t);

vector<prmNode> app;

prmNode par=nodes[e.getFrom()]; 
prmNode arr=nodes[e.getTo()];

app.push_back(par);
app.push_back(arr);

archi.insert(pair<prmEdge,vector<prmNode> >(e,app) );

return true;
 }

}

Auf diese Weise habe ich einen Fehler in der Kompilierung im Klassenpaar.H. Was könnte ich tuen?? Vielen Dank.

War es hilfreich?

Lösung

Sie müssen einen Komparator für PrMedge anbieten. Ich vermute, dass der Standardvergleich für MAP verwendet wird, z. B. den Vergleich der Adresse des Schlüssels - was immer gleich ist, weil e ist lokal.

Objekte, die als Schlüssel in der Karte dienen, müssen bestellt werden. Daher müssen Sie entweder einen Bediener zum Vergleichen von Kanten oder eine Komparatorfunktion für die Karte anbieten.

class EdgeComparator {
public:
   bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
      // ... ?
   }
};

map<prmEdge,vector<prmNode>, EdgeComparator > archi;

Der wirklich schwierige Teil ist die Entscheidung, wie die Kanten verglichen werden, sodass eine endgültige Reihenfolge definiert ist. Angenommen, Sie haben nur from und to Sie können es versuchen mit:

class EdgeComparator {
public:
   bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
      if ( emp1.from != emp2.from ) 
          return ( emp1.from < emp2.from );
      return ( emp1.to < emp2.to );
   }
};

Es wird den Primärschlüssel sortieren from und sekundär to.

Andere Tipps

Die Klasse prmEdge Muss eine Vergleichsfunktion definieren (Standardeinstellung ist operator<) arbeiten mit std::map. Obwohl Sie diesen Code nicht posten, würde ich erwarten, dass dies Ihr Problem ist (für den Datensatz hat Zeiger eine operator< definiert.

struct A {
    int a;
    bool operator<(A other)
    {
        return a < other.a;
    }
};

struct B {
    int b;
};

bool cmp(B lhs, B rhs)
{
    return lhs.b < rhs.b;
}

std::map<A, int> map_a;
std::map<B, int, std::pointer_to_binary_function<B, B, bool> > map_b(std::ptr_fun(cmp));

Kartenelemente werden von ihren Schlüssel bestellt. Aber die Karte muss wissen, wie:

Entweder überlastet die < Operator in der Prmedge -Klasse ...

class prmEdge
{
    //...
    public:
        bool operator<(const prmEdge& right) const
        {
            //...
        }
};

... oder geben Sie einen Komparator für die Karte an:

class Comparator
{
    public:
        bool operator()(const prmEdge& left, const prmEdge& right) const 
        {
          // ...
        }
};

map<prmEdge, vector<prmNode>, Comparator> archi;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top