<?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[Problem mit STL-Containern und const-parametern]]></title><description><![CDATA[<p>hallo zusammen!</p>
<p>ich habe folgendes Problem zu dem ich bisher noch nichts gefunden habe und irgendwie auch total auf dem Schlauch stehe.<br />
Ich habe in einer Klasse als Member diverse Container, die Pointer auf Objekte speichern, also z.b.</p>
<pre><code class="language-cpp">std::vector&lt;MyObject*&gt; vec;
</code></pre>
<p>In meinem konkreten Fall ist es zwar ein unordered_set, aber das dürfte nichts ändern, mit anderen Containern habe ich das Problem auch.<br />
Nun möchte ich für diese Klasse, nennen wir sie MyClass, folgende Methode schreiben:</p>
<pre><code class="language-cpp">bool MyClass::Exists(MyObject* o)
</code></pre>
<p>Ich würde das ja gerne const-correct machen:</p>
<pre><code class="language-cpp">bool MyClass::Exists(const MyObject* o) const
{
  return vec.count(o) != 0;
}
</code></pre>
<p>Das geht aber nicht. Der Compiler (GCC 4.1 btw) meckert mich an, dass ich beim Aufruf von Count() eine ungültige Konvertierung von const MyObject* nach MyObject* hätte.<br />
Ich weiß nicht, warum er hier die nicht-const Variante von count() aufrufen will, da diese Methode nach einem Blick in die STL-header auch const-Überladen ist.<br />
Das ganze leuchtet mir nicht ganz ein.<br />
Verwende ich STL-Algorithmen (z.b. std::find()) funktioniert das tadellos, wobei doch dann eigentlich irgendwie das gleiche Problem auftauchen müsste.<br />
Daher sieht meine Methode im Moment so aus, was mich aber nicht zufriedenstellt:</p>
<pre><code class="language-cpp">bool MyClass::Exists(MyObject* o) const
{
  return vec.count(o) != 0;
}
</code></pre>
<p>Ich glaube, ich übersehe irgendwas ganz einfaches <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Würde mich freuen wenn jemand eine Lösung hat, denn ich will die Methode gerne wirklich const-correct umsetzen, und nicht nur halb.</p>
<p>Grüße,</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227114/problem-mit-stl-containern-und-const-parametern</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 06:22:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227114.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Nov 2008 08:59:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit STL-Containern und const-parametern on Tue, 11 Nov 2008 09:44:54 GMT]]></title><description><![CDATA[<p>hallo zusammen!</p>
<p>ich habe folgendes Problem zu dem ich bisher noch nichts gefunden habe und irgendwie auch total auf dem Schlauch stehe.<br />
Ich habe in einer Klasse als Member diverse Container, die Pointer auf Objekte speichern, also z.b.</p>
<pre><code class="language-cpp">std::vector&lt;MyObject*&gt; vec;
</code></pre>
<p>In meinem konkreten Fall ist es zwar ein unordered_set, aber das dürfte nichts ändern, mit anderen Containern habe ich das Problem auch.<br />
Nun möchte ich für diese Klasse, nennen wir sie MyClass, folgende Methode schreiben:</p>
<pre><code class="language-cpp">bool MyClass::Exists(MyObject* o)
</code></pre>
<p>Ich würde das ja gerne const-correct machen:</p>
<pre><code class="language-cpp">bool MyClass::Exists(const MyObject* o) const
{
  return vec.count(o) != 0;
}
</code></pre>
<p>Das geht aber nicht. Der Compiler (GCC 4.1 btw) meckert mich an, dass ich beim Aufruf von Count() eine ungültige Konvertierung von const MyObject* nach MyObject* hätte.<br />
Ich weiß nicht, warum er hier die nicht-const Variante von count() aufrufen will, da diese Methode nach einem Blick in die STL-header auch const-Überladen ist.<br />
Das ganze leuchtet mir nicht ganz ein.<br />
Verwende ich STL-Algorithmen (z.b. std::find()) funktioniert das tadellos, wobei doch dann eigentlich irgendwie das gleiche Problem auftauchen müsste.<br />
Daher sieht meine Methode im Moment so aus, was mich aber nicht zufriedenstellt:</p>
<pre><code class="language-cpp">bool MyClass::Exists(MyObject* o) const
{
  return vec.count(o) != 0;
}
</code></pre>
<p>Ich glaube, ich übersehe irgendwas ganz einfaches <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Würde mich freuen wenn jemand eine Lösung hat, denn ich will die Methode gerne wirklich const-correct umsetzen, und nicht nur halb.</p>
<p>Grüße,</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613038</guid><dc:creator><![CDATA[andreas_schilling]]></dc:creator><pubDate>Tue, 11 Nov 2008 09:44:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit STL-Containern und const-parametern on Tue, 11 Nov 2008 10:03:31 GMT]]></title><description><![CDATA[<p>Ich schätze mal, die count-Methode von vector (die ich im Übrigen gar nicht kenne, g++-Erweiterung?) sieht etwa so aus:</p>
<pre><code class="language-cpp">size_t count( const T&amp; elem );
</code></pre>
<p>Da dein Container Elemente vom Typ <code>MyObject*</code> beinhaltet, will er als Argument auch ein <code>const MyObject*&amp;</code> (das 'const' bezieht sich auf die Referenz), was natürlich nicht zusammenpasst mit dem const-Zeiger, den du übergibst..<br />
Das ist eins von mehreren leidigen Problemen, die man mit Zeiger-Vektoren so erwischen kann. Evtl tut's std::count?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613081</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 11 Nov 2008 10:03:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit STL-Containern und const-parametern on Tue, 11 Nov 2008 10:55:29 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ich schätze mal, die count-Methode von vector (die ich im Übrigen gar nicht kenne, g++-Erweiterung?) sieht etwa so aus:</p>
<pre><code class="language-cpp">size_t count( const T&amp; elem );
</code></pre>
</blockquote>
<p>Richtig. Vermutlich hat vector auch wirklich kein count(), ich habe nur den vector als Beispiel genommen, bevor ich 1000 Antworten bekomme mit &quot;std::unordered_set kenne ich nicht, da verhält sich bestimmt alles ganz anders und es liegt daran&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Das ist eins von mehreren leidigen Problemen, die man mit Zeiger-Vektoren so erwischen kann. Evtl tut's std::count?</p>
</blockquote>
<p>Hmm, danke für die Erläuterung, irgendwas in der Art habe ich mir auch gedacht/befürchtet.<br />
Die STL-Algorithmen (std::find, std::count) tun's auf jeden Fall, liefern ja das gleiche Ergebnis, ich bin mir nur nicht 100% sicher, ob die dann auch performancemäßig äquivalent sind? Könnte ja schon sein, dass die Container-Funktionen besser optimiert sind weil sie ja genau wissen, wie die unterliegende Implementierung funktioniert.<br />
Weißt du da was dazu?</p>
<p>Danke und Grüße,</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613103</guid><dc:creator><![CDATA[andreas_schilling]]></dc:creator><pubDate>Tue, 11 Nov 2008 10:55:29 GMT</pubDate></item></channel></rss>