<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[pair als Key für hash_map]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte gern eine hash_map mit einem pair von 2 int als key verwenden<br />
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 &lt;origin, target&gt; eindeutig ist.<br />
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:<br />
Beim Aufruf von find() bzw. insert() bekomme ich dann die ffg. Fehlermeldung (Auszug):</p>
<p>...\_hashtable.h(557) : error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt<br />
...\_hashtable.h(546): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::size_type stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::_M_bkt_num_key&lt;_KT&gt;(const _KT &amp;,stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::size_type) const&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Val=stlp_std::pair&lt;const ii_pair,ii_pair&gt;,<br />
1&gt; _Key=stlp_std::pair&lt;int,int&gt;,<br />
1&gt; _HF=stlp_std::hash&lt;ii_pair&gt;,<br />
1&gt; _Traits=stlp_std::priv::_HashMapTraitsT&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _ExK=stlp_std::_Select1st&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _EqK=stlp_std::equal_to&lt;ii_pair&gt;,<br />
1&gt; _All=stlp_std::allocator&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _KT=stlp_std::pair&lt;int,int&gt;<br />
1&gt; ]<br />
1&gt; ...\_hashtable.h(553): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::size_type stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::_M_bkt_num_key&lt;stlp_std::pair&lt;_T1,_T2&gt;&gt;(const _KT &amp;) const&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Val=stlp_std::pair&lt;const ii_pair,ii_pair&gt;,<br />
1&gt; _Key=stlp_std::pair&lt;int,int&gt;,<br />
1&gt; _HF=stlp_std::hash&lt;ii_pair&gt;,<br />
1&gt; _Traits=stlp_std::priv::_HashMapTraitsT&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _ExK=stlp_std::_Select1st&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _EqK=stlp_std::equal_to&lt;ii_pair&gt;,<br />
1&gt; _All=stlp_std::allocator&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _T1=int,<br />
1&gt; _T2=int,<br />
1&gt; _KT=stlp_std::pair&lt;int,int&gt;<br />
1&gt; ]</p>
<pre><code>#...
#include &lt;hash_map&gt;

int t_idx[3];

typedef std::pair&lt;int, int&gt; ii_pair;
typedef std::hash_map&lt;ii_pair, ii_pair&gt; pp_hash;
static pp_hash* halfEdge_hash;

int main(int argc, char *argv[])
{
  // ...
  halfEdge_hash = new pp_hash;
  halfEdge_hash-&gt;clear();
  std::pair&lt;int, int&gt;halfedge;
  std::pair&lt;int, int&gt;connection;
  // Bestimmung von t_idx[0], t_idx[1], t_idx[3]
  // ...
  pp_hash::iterator half_edge;
  for (int i = 0; i &lt; 3; i++)
  {
    halfedge = std::make_pair(t_idx[(i+1)%3], t_idx[i]);
    half_edge = halfEdge_hash-&gt;find(halfedge);
    if (half_edge == halfEdge_hash-&gt;end())
    {
       // Die Kante neu einfügen
        halfEdge_hash-&gt;insert(pp_hash::value_type(ii_pair(t_idx[i],t_idx[(i+1)%3]),/*...*/));
    }
    else
    {
     // Berechnungen ...
     halfEdge_hash-&gt;erase(half_edge_Iterator);
    }
  }
  // ...
  return 0;
}
</code></pre>
<p>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 &quot;verwendet&quot; hat, so dass am Ende nur die Kanten übrig bleiben, an denen kein weiteres Dreieck anliegt.</p>
<p>thx for help,</p>
<p>Ennokan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187168/pair-als-key-für-hash_map</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 14:37:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187168.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Jul 2007 15:19:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to pair als Key für hash_map on Mon, 16 Jul 2007 15:19:57 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte gern eine hash_map mit einem pair von 2 int als key verwenden<br />
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 &lt;origin, target&gt; eindeutig ist.<br />
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:<br />
Beim Aufruf von find() bzw. insert() bekomme ich dann die ffg. Fehlermeldung (Auszug):</p>
<p>...\_hashtable.h(557) : error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt<br />
...\_hashtable.h(546): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::size_type stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::_M_bkt_num_key&lt;_KT&gt;(const _KT &amp;,stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::size_type) const&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Val=stlp_std::pair&lt;const ii_pair,ii_pair&gt;,<br />
1&gt; _Key=stlp_std::pair&lt;int,int&gt;,<br />
1&gt; _HF=stlp_std::hash&lt;ii_pair&gt;,<br />
1&gt; _Traits=stlp_std::priv::_HashMapTraitsT&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _ExK=stlp_std::_Select1st&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _EqK=stlp_std::equal_to&lt;ii_pair&gt;,<br />
1&gt; _All=stlp_std::allocator&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _KT=stlp_std::pair&lt;int,int&gt;<br />
1&gt; ]<br />
1&gt; ...\_hashtable.h(553): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::size_type stlp_std::hashtable&lt;_Val,_Key,_HF,_Traits,_ExK,_EqK,_All&gt;::_M_bkt_num_key&lt;stlp_std::pair&lt;_T1,_T2&gt;&gt;(const _KT &amp;) const&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Val=stlp_std::pair&lt;const ii_pair,ii_pair&gt;,<br />
1&gt; _Key=stlp_std::pair&lt;int,int&gt;,<br />
1&gt; _HF=stlp_std::hash&lt;ii_pair&gt;,<br />
1&gt; _Traits=stlp_std::priv::_HashMapTraitsT&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _ExK=stlp_std::_Select1st&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _EqK=stlp_std::equal_to&lt;ii_pair&gt;,<br />
1&gt; _All=stlp_std::allocator&lt;stlp_std::pair&lt;const ii_pair,ii_pair&gt;&gt;,<br />
1&gt; _T1=int,<br />
1&gt; _T2=int,<br />
1&gt; _KT=stlp_std::pair&lt;int,int&gt;<br />
1&gt; ]</p>
<pre><code>#...
#include &lt;hash_map&gt;

int t_idx[3];

typedef std::pair&lt;int, int&gt; ii_pair;
typedef std::hash_map&lt;ii_pair, ii_pair&gt; pp_hash;
static pp_hash* halfEdge_hash;

int main(int argc, char *argv[])
{
  // ...
  halfEdge_hash = new pp_hash;
  halfEdge_hash-&gt;clear();
  std::pair&lt;int, int&gt;halfedge;
  std::pair&lt;int, int&gt;connection;
  // Bestimmung von t_idx[0], t_idx[1], t_idx[3]
  // ...
  pp_hash::iterator half_edge;
  for (int i = 0; i &lt; 3; i++)
  {
    halfedge = std::make_pair(t_idx[(i+1)%3], t_idx[i]);
    half_edge = halfEdge_hash-&gt;find(halfedge);
    if (half_edge == halfEdge_hash-&gt;end())
    {
       // Die Kante neu einfügen
        halfEdge_hash-&gt;insert(pp_hash::value_type(ii_pair(t_idx[i],t_idx[(i+1)%3]),/*...*/));
    }
    else
    {
     // Berechnungen ...
     halfEdge_hash-&gt;erase(half_edge_Iterator);
    }
  }
  // ...
  return 0;
}
</code></pre>
<p>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 &quot;verwendet&quot; hat, so dass am Ende nur die Kanten übrig bleiben, an denen kein weiteres Dreieck anliegt.</p>
<p>thx for help,</p>
<p>Ennokan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326663</guid><dc:creator><![CDATA[Ennokan]]></dc:creator><pubDate>Mon, 16 Jul 2007 15:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to pair als Key für hash_map on Tue, 17 Jul 2007 06:33:03 GMT]]></title><description><![CDATA[<p>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&lt;&gt; einen (mehr oder weniger) eindeutigen int-Wert generiert - und diese Hash-Funktion als zusätzlichen Template-Parameter übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326927</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 17 Jul 2007 06:33:03 GMT</pubDate></item></channel></rss>