<?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[Suchen mit Zeiger auf Konstante in einer map]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine map, die als Schlüssel einen Zeiger auf ein <em>nicht</em> konstantes Objekt enthält. Nun möchte ich mit einem Zeiger auf ein konstantes Objekt (vom selben Typ) danach suchen.<br />
Ist das möglich? Ohne dass ich den Schlüssel in einen Zeiger auf ein <em>konstantes</em> Objekt ändern muss? Oder muss ich einen anderen Container benutzen?</p>
<p>Also:</p>
<pre><code>std::map&lt;Objekt *, value&gt; MeineMap; // Kann ich den Schlüssel ändern, so dass ich mit 'const Objekt *' danach suchen kann?
...
const Objekt *SucheObjekt(const Objekt *MeinObject)
{
  std::map&lt;Objekt *, value&gt;::const_iterator it = MeineMap.find(MeinObject); // &lt;--- Geht nicht
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/333784/suchen-mit-zeiger-auf-konstante-in-einer-map</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 17:09:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333784.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Jul 2015 08:30:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 08:30:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine map, die als Schlüssel einen Zeiger auf ein <em>nicht</em> konstantes Objekt enthält. Nun möchte ich mit einem Zeiger auf ein konstantes Objekt (vom selben Typ) danach suchen.<br />
Ist das möglich? Ohne dass ich den Schlüssel in einen Zeiger auf ein <em>konstantes</em> Objekt ändern muss? Oder muss ich einen anderen Container benutzen?</p>
<p>Also:</p>
<pre><code>std::map&lt;Objekt *, value&gt; MeineMap; // Kann ich den Schlüssel ändern, so dass ich mit 'const Objekt *' danach suchen kann?
...
const Objekt *SucheObjekt(const Objekt *MeinObject)
{
  std::map&lt;Objekt *, value&gt;::const_iterator it = MeineMap.find(MeinObject); // &lt;--- Geht nicht
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2461789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461789</guid><dc:creator><![CDATA[coder777]]></dc:creator><pubDate>Fri, 31 Jul 2015 08:30:34 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 08:57:39 GMT]]></title><description><![CDATA[<p>const_cast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461790</guid><dc:creator><![CDATA[cccc]]></dc:creator><pubDate>Fri, 31 Jul 2015 08:57:39 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 09:03:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::map&lt;const Objekt *, value&gt; MeineMap;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2461791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461791</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 31 Jul 2015 09:03:56 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 09:04:17 GMT]]></title><description><![CDATA[<blockquote>
<p>const_cast?</p>
</blockquote>
<p>Das wäre nicht gut...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461792</guid><dc:creator><![CDATA[coder777]]></dc:creator><pubDate>Fri, 31 Jul 2015 09:04:17 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 09:07:41 GMT]]></title><description><![CDATA[<p>coder777 schrieb:</p>
<blockquote>
<blockquote>
<p>const_cast?</p>
</blockquote>
<p>Das wäre nicht gut...</p>
</blockquote>
<p>Wieso? Dein Programm ist sowieso nicht const-sicher, da du mit find Zugriff auf den Key erhältst (und der ist nicht const).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461793</guid><dc:creator><![CDATA[cccc]]></dc:creator><pubDate>Fri, 31 Jul 2015 09:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 09:41:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Wieso? Dein Programm ist sowieso nicht const-sicher, da du mit find Zugriff auf den Key erhältst (und der ist nicht const).</p>
</blockquote>
<p>Das übergebene Objekt muss sich aber nicht notwendiger Weise in der map befinden.</p>
<p>Es ist so, dass sich die map in einer Klasse befindet.<br />
Intern darf die Klasse die Objekte änderen (und andere Klassen darüber informieren).<br />
Extern darf sich aber nichts ohne Einbeziehung der Klasse änderen.<br />
Den Schlüssel konstant zu machen ist leider keine Alternative.</p>
<p>Das einzige Problem ist, dass ich den Zeiger auf das konstante Objekt der find(...) Funktion nicht übergeben kann. Vergleichsoperatoren würden ja funktionieren.</p>
<p>Keine Alternativen zu const_cast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461800</guid><dc:creator><![CDATA[coder777]]></dc:creator><pubDate>Fri, 31 Jul 2015 09:41:33 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 10:05:04 GMT]]></title><description><![CDATA[<p>Mit C++14 kannst du es mit std::less&lt;&gt; als Vergleichsoperator machen. Ich weise allerdings nochmal darauf hin, dass das eine schlechte Idee ist und nicht besser als ein const_cast.</p>
<blockquote>
<p>Es ist so, dass sich die map in einer Klasse befindet.<br />
Intern darf die Klasse die Objekte änderen (und andere Klassen darüber informieren).<br />
Extern darf sich aber nichts ohne Einbeziehung der Klasse änderen.</p>
</blockquote>
<p>Perfekt, dann mach die map privat und biete Zugriffsfunktionen an, die sich schön um const-correctness kümmern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461803</guid><dc:creator><![CDATA[cccc]]></dc:creator><pubDate>Fri, 31 Jul 2015 10:05:04 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 10:27:53 GMT]]></title><description><![CDATA[<p>cccc schrieb:</p>
<blockquote>
<p>Mit C++14 kannst du es mit std::less&lt;&gt; als Vergleichsoperator machen.</p>
</blockquote>
<p>Nicht das ich das vor hätte, aber was genau meinst du? <code>std::less&lt;&gt;</code> als dritten Template Parameter für die map oder was? Das ist hilft jedenfalls nicht, da schon die Signatur von <code>std::map::find</code> konstante Pointer ablehnt.</p>
<p>Mir würde sonst noch das hier einfallen (auch nicht unbedingt leserlicher als der <code>const_cast</code> ).</p>
<pre><code>const Objekt *SucheObjekt(const Objekt *MeinObject) {
  std::map&lt;Objekt *, value&gt;::const_iterator it =
      std::find_if(MeineMap.begin(), MeineMap.end(),
                   [&amp;](const auto &amp;p) { return p.first == MeinObject; });
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2461806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461806</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 31 Jul 2015 10:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 10:30:35 GMT]]></title><description><![CDATA[<p>Nachtrag: Und vor allem ist es langsamer, da <code>std::find_if</code> über alle Keys iteriert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461807</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 31 Jul 2015 10:30:35 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 10:41:16 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>cccc schrieb:</p>
<blockquote>
<p>Mit C++14 kannst du es mit std::less&lt;&gt; als Vergleichsoperator machen.</p>
</blockquote>
<p>Nicht das ich das vor hätte, aber was genau meinst du? <code>std::less&lt;&gt;</code> als dritten Template Parameter für die map oder was?</p>
</blockquote>
<p>Ja.</p>
<pre><code class="language-cpp">std::map&lt;int *, int, std::less&lt;&gt;&gt; MeineMap;
int i = 0;
auto const *p = &amp;i;
auto it = MeineMap.find(p);
</code></pre>
<p>Funktioniert, weil<a href="http://en.cppreference.com/w/cpp/utility/functional/less_void" rel="nofollow"> <code>std::less&lt;&gt;</code> </a>einen Membertyp <code>is_transparent</code> hat und die map dadurch eine neue Überladung anbietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461810</guid><dc:creator><![CDATA[cccc]]></dc:creator><pubDate>Fri, 31 Jul 2015 10:41:16 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 11:05:38 GMT]]></title><description><![CDATA[<p>Ah interessant. Das ist aber schon ein ziemlich neues Feature... Die STL Version, welche mit gcc 4.9 kommt hat das noch nicht drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461814</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 31 Jul 2015 11:05:38 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 13:59:43 GMT]]></title><description><![CDATA[<p>Die C++14 Erweiterung ist schon genau das was ich brauche. Nur ist C++14 noch nicht richtig angekommen. Ich verstehe das is_transparent auch nicht so richtig.</p>
<p>Ich habe jetzt erst einmal const_cast benutzt.</p>
<p>cccc schrieb:</p>
<blockquote>
<p>Perfekt, dann mach die map privat und biete Zugriffsfunktionen an, die sich schön um const-correctness kümmern.</p>
</blockquote>
<p>Genauso habe ich das auch gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461827</guid><dc:creator><![CDATA[coder777]]></dc:creator><pubDate>Fri, 31 Jul 2015 13:59:43 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen mit Zeiger auf Konstante in einer map on Fri, 31 Jul 2015 17:31:29 GMT]]></title><description><![CDATA[<p>coder777 schrieb:</p>
<blockquote>
<p>Ich verstehe das is_transparent auch nicht so richtig.</p>
</blockquote>
<p>Das ist mal wieder Template Zeug. Wenn ein Comparator vergleiche mit beliebigen Typen unterstützt, dann soll dieser das eben bekannt machen indem es ein typedef für <code>is_transparent</code> definiert. Für welchen Typ das typedef ist ist dabei völlig egal, wichtig ist nur, dass es existiert. Denn dann kann eine Klasse wie z.B. <code>std::map</code> prüfen ob dieses typedef existiert und nur dann zusätzliche <code>find</code> Funktionen anbieten (Stichwort zum googeln: SFINAE).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461852</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 31 Jul 2015 17:31:29 GMT</pubDate></item></channel></rss>