pair als Key für hash_map



  • Hallo,

    ich möchte gern eine hash_map mit einem pair von 2 int als key verwenden
    Zur Erklärung: Das Key-pair soll die Indizes von Koordinatenpunkten halten, die verbunden eine Linie ergeben. Da ich die vertices und faces (Dreiecke) aus einer Datei auslese, habe ich nur deren Indizes und nicht die der Linien, so dass eine Linie nur als Schlüsselpaar der Form <origin, target> eindeutig ist.
    Ich hab auch hier im Forum schon einmal zu meinem Problem gesucht, bin da auch fündig geworden, aber die beschriebene Lösung hatte ich im Prinzip schon umgesetzt (Codefragmente sind unten beigefügt). Das Problem bleibt und ich weiß net mehr so recht weiter:
    Beim Aufruf von find() bzw. insert() bekomme ich dann die ffg. Fehlermeldung (Auszug):

    ...\_hashtable.h(557) : error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
    ...\_hashtable.h(546): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "stlp_std::hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::size_type stlp_std::hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::_M_bkt_num_key<_KT>(const _KT &,stlp_std::hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::size_type) const".
    1> with
    1> [
    1> _Val=stlp_std::pair<const ii_pair,ii_pair>,
    1> _Key=stlp_std::pair<int,int>,
    1> _HF=stlp_std::hash<ii_pair>,
    1> _Traits=stlp_std::priv::_HashMapTraitsT<stlp_std::pair<const ii_pair,ii_pair>>,
    1> _ExK=stlp_std::_Select1st<stlp_std::pair<const ii_pair,ii_pair>>,
    1> _EqK=stlp_std::equal_to<ii_pair>,
    1> _All=stlp_std::allocator<stlp_std::pair<const ii_pair,ii_pair>>,
    1> _KT=stlp_std::pair<int,int>
    1> ]
    1> ...\_hashtable.h(553): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "stlp_std::hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::size_type stlp_std::hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::_M_bkt_num_key<stlp_std::pair<_T1,_T2>>(const _KT &) const".
    1> with
    1> [
    1> _Val=stlp_std::pair<const ii_pair,ii_pair>,
    1> _Key=stlp_std::pair<int,int>,
    1> _HF=stlp_std::hash<ii_pair>,
    1> _Traits=stlp_std::priv::_HashMapTraitsT<stlp_std::pair<const ii_pair,ii_pair>>,
    1> _ExK=stlp_std::_Select1st<stlp_std::pair<const ii_pair,ii_pair>>,
    1> _EqK=stlp_std::equal_to<ii_pair>,
    1> _All=stlp_std::allocator<stlp_std::pair<const ii_pair,ii_pair>>,
    1> _T1=int,
    1> _T2=int,
    1> _KT=stlp_std::pair<int,int>
    1> ]

    #...
    #include <hash_map>
    
    int t_idx[3];
    
    typedef std::pair<int, int> ii_pair;
    typedef std::hash_map<ii_pair, ii_pair> pp_hash;
    static pp_hash* halfEdge_hash;
    
    int main(int argc, char *argv[])
    {
      // ...
      halfEdge_hash = new pp_hash;
      halfEdge_hash->clear();
      std::pair<int, int>halfedge;
      std::pair<int, int>connection;
      // Bestimmung von t_idx[0], t_idx[1], t_idx[3]
      // ...
      pp_hash::iterator half_edge;
      for (int i = 0; i < 3; i++)
      {
        halfedge = std::make_pair(t_idx[(i+1)%3], t_idx[i]);
        half_edge = halfEdge_hash->find(halfedge);
        if (half_edge == halfEdge_hash->end())
        {
           // Die Kante neu einfügen
            halfEdge_hash->insert(pp_hash::value_type(ii_pair(t_idx[i],t_idx[(i+1)%3]),/*...*/));
        }
        else
        {
         // Berechnungen ...
         halfEdge_hash->erase(half_edge_Iterator);
        }
      }
      // ...
      return 0;
    }
    

    Hat das schon mal jemand erfolgreich hinbekommen? Ich weiß nicht, wie ich sonst effektiv nach und nach alle Linien einlesen kann, und die wieder entfernen, die schon ein anderes Dreieck "verwendet" hat, so dass am Ende nur die Kanten übrig bleiben, an denen kein weiteres Dreieck anliegt.

    thx for help,

    Ennokan



  • Ich kenne zwar nicht diese Version der Hash-Tabelle im Speziellen, aber vermutlich mußt du dir eine eigene Hash-Funktion schreiben, die aus deinem pair<> einen (mehr oder weniger) eindeutigen int-Wert generiert - und diese Hash-Funktion als zusätzlichen Template-Parameter übergeben.


Anmelden zum Antworten