<?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[Vector von Zeigern nach Adresse von Objekten durchsuchen]]></title><description><![CDATA[<p>Hallo,<br />
ich habe in meiner Klasse folgenden Vektor definiert:</p>
<pre><code class="language-cpp">class Teilnehmer {

private:
	std::string Name;
	std::vector&lt;Teilnehmer*&gt; Bekannte;
</code></pre>
<p>In Bekannte sollen die Adressen von anderen Objekten der Klasse eingetragen werden. Um zu prüfen, ob ein Teilnehmer einen anderen schon kennt habe ich folgende Methode geschrieben:</p>
<pre><code class="language-cpp">bool Teilnehmer::kennt(const Teilnehmer&amp; andere) const {
	size_t pos=0;
	pos=find(Bekannte.begin(), Bekannte.end(), &amp;andere);
	...
}
</code></pre>
<p>Allerdings meckert der Compiler rum, das beim find etwas nicht passen würde. Wo liegt mein Fehler?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262965/vector-von-zeigern-nach-adresse-von-objekten-durchsuchen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 05:55:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262965.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Mar 2010 10:59:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 10:59:05 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe in meiner Klasse folgenden Vektor definiert:</p>
<pre><code class="language-cpp">class Teilnehmer {

private:
	std::string Name;
	std::vector&lt;Teilnehmer*&gt; Bekannte;
</code></pre>
<p>In Bekannte sollen die Adressen von anderen Objekten der Klasse eingetragen werden. Um zu prüfen, ob ein Teilnehmer einen anderen schon kennt habe ich folgende Methode geschrieben:</p>
<pre><code class="language-cpp">bool Teilnehmer::kennt(const Teilnehmer&amp; andere) const {
	size_t pos=0;
	pos=find(Bekannte.begin(), Bekannte.end(), &amp;andere);
	...
}
</code></pre>
<p>Allerdings meckert der Compiler rum, das beim find etwas nicht passen würde. Wo liegt mein Fehler?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868660</guid><dc:creator><![CDATA[Der Anfänger!]]></dc:creator><pubDate>Sun, 14 Mar 2010 10:59:05 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 11:09:29 GMT]]></title><description><![CDATA[<p>1. Wieso zeigst du uns die Fehlermeldung nicht?<br />
2. Rückgabewert von find ist nicht ein size_t sondern einen Iterator.<br />
<a href="http://www.cplusplus.com/reference/algorithm/find/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/find/</a><br />
3. Gleichheit von Objekten über deren Adresse zu prüfen, ist meistens eine schlechte Idee.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868666</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 14 Mar 2010 11:09:29 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 11:15:27 GMT]]></title><description><![CDATA[<p>Dann poste bitte auch WAS der Compiler zu meckern hat. Wie Eltern die meckern hat der Compiler nämlich auch was zu sagen und nicht nur zu schimpfen...</p>
<p><a href="http://www.cplusplus.com/reference/algorithm/find/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/find/</a><br />
Kennst du schon.<br />
Du weißt was std::vector::begin() und std::vector::end() zurückliefern?<br />
Dann weißt du auch dass es kein size_t ist, sondern ein std::vector::(const_)iterator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868669</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sun, 14 Mar 2010 11:15:27 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 11:15:47 GMT]]></title><description><![CDATA[<p>Ok hier der Fehler:</p>
<pre><code class="language-cpp">error: cannot convert '__gnu_cxx::__normal_iterator&lt;Teilnehmer* const*, std::vector&lt;Teilnehmer*, std::allocator&lt;Teilnehmer*&gt; &gt; &gt;' to 'size_t' in assignment
</code></pre>
<p>also realisieren möchte ich folgendes. Die Klasse Teilnehmer stellt Personen dar. Ich möchte eine Methode bauen, das sich Teilnehmer kennen lernen können. Da wollte ich jeweils die Adressen der Bekannten in einen Vector speichern. Aber wieso ist das eine schlechte Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868670</guid><dc:creator><![CDATA[Der Anfänger!]]></dc:creator><pubDate>Sun, 14 Mar 2010 11:15:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 11:55:49 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">size_t pos = ~size_t(0); 
std::vector&lt;Teilnehmer*&gt;::const_iterator iter = find(Bekannte.begin(), Bekannte.end(), &amp;andere);
if( iter != Bekannte.end() ){
    pos = size_t( iter - Bekannte.begin() );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1868685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868685</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sun, 14 Mar 2010 11:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 12:17:53 GMT]]></title><description><![CDATA[<p>Danke das find werde ich noch einarbeiten. Hier die Klasse mit manuellem Find:</p>
<p>Teilnehmer.h:</p>
<pre><code class="language-cpp">#ifndef _TEILNEHMER_H
#define	_TEILNEHMER_H

#include&lt;vector&gt;
#include&lt;string&gt;

class Teilnehmer {
public:
    Teilnehmer(const std::string N):Name(N){};
    bool kennt(const Teilnehmer&amp; andere) const;
    const std::string&amp; gibNamen() const{return Name;}
    void lerntKennen(Teilnehmer&amp;);
    void druckeBekannte() const;
private:
    std::string Name;
    std::vector&lt;Teilnehmer*&gt; Bekannte;

};

#endif
</code></pre>
<p>Teilnehmer.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;

#include &quot;Teilnehmer.h&quot;

using namespace std;

bool Teilnehmer::kennt(const Teilnehmer&amp; andere) const {
    size_t Anzahl=Bekannte.size();
    for (size_t i=0; i&lt;Anzahl;++i) {
        if(Bekannte[i]==&amp;andere){
            return true;
        }
    }
    return false;
}

void Teilnehmer::lerntKennen(Teilnehmer&amp; andere) {
    if( !(kennt(andere)) &amp;&amp; (&amp;andere != this) ) {
        Bekannte.push_back(&amp;andere);
        andere.lerntKennen(*this);
    }
}

void Teilnehmer::druckeBekannte() const {
    size_t Anzahl=Bekannte.size();
    for(size_t i=0; i&lt;Anzahl; ++i) {
        cout &lt;&lt; Bekannte[i]-&gt;gibNamen()&lt;&lt;endl;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1868687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868687</guid><dc:creator><![CDATA[Der Anfänger!]]></dc:creator><pubDate>Sun, 14 Mar 2010 12:17:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 12:36:08 GMT]]></title><description><![CDATA[<p>Hier noch mal mit iterator:</p>
<pre><code class="language-cpp">bool Teilnehmer::kennt(const Teilnehmer&amp; andere) const {
    vector&lt;Teilnehmer*&gt;::const_iterator iter=find(Bekannte.begin(), Bekannte.end(), &amp;andere);
    if(iter != Bekannte.end()) return true; else return false;
}
</code></pre>
<p>Zu den STL Algorithmen bin ich in meinem Buch leider noch nicht gekommen. Deshalb bin ich da ein wenig unerfahren. Dazu mal ein paar Fragen:</p>
<p>Ist es nicht effizienter ohne find()? Weil wie ich es ohne gemacht habe bricht es ja sofort ab, wenn der Kandidat gefunden wurde. find() geht aber immer bis zum Schluss.</p>
<p>Dann kann mir bitte jemand folgendes erklären:</p>
<pre><code class="language-cpp">vector&lt;Teilnehmer*&gt;::const_iterator
</code></pre>
<p>was bedeutet da das ::const_iterator. Das hat ja was mit Namensbereichen zu tun. Heißt das const_iterator ist aus dem Namensraum vector...?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868704</guid><dc:creator><![CDATA[Der Anfänger!]]></dc:creator><pubDate>Sun, 14 Mar 2010 12:36:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 12:43:47 GMT]]></title><description><![CDATA[<p>Der Anfänger! schrieb:</p>
<blockquote>
<p>find() geht aber immer bis zum Schluss.</p>
</blockquote>
<p>Woher weisst du das?</p>
<p>Der Anfänger! schrieb:</p>
<blockquote>
<p>Dann kann mir bitte jemand folgendes erklären:</p>
<pre><code class="language-cpp">vector&lt;Teilnehmer*&gt;::const_iterator
</code></pre>
<p>was bedeutet da das ::const_iterator. Das hat ja was mit Namensbereichen zu tun. Heißt das const_iterator ist aus dem Namensraum vector...?</p>
</blockquote>
<p>Nein, <code>vector&lt;Teilnehmer*&gt;</code> ist eine Klasse (genauer gesagt die Instanziierung eines Klassentemplates). <code>const_iterator</code> ist ein Typ, der innerhalb der Klasse definiert wurde, also entweder ein <code>typedef</code> oder gleich eine vollständige Klassendefinition. Im Gegensatz zum <code>iterator</code> darf der <code>const_iterator</code> die referenzierten Elemente nicht verändern.</p>
<p>Statt</p>
<pre><code class="language-cpp">if(iter != Bekannte.end()) return true; else return false;
</code></pre>
<p>kannst du übrigens Folgendes schreiben:</p>
<pre><code class="language-cpp">return iter != Bekannte.end();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1868712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868712</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 14 Mar 2010 12:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 14:21:58 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Der Anfänger! schrieb:</p>
<blockquote>
<p>find() geht aber immer bis zum Schluss.</p>
</blockquote>
<p>Woher weisst du das?</p>
</blockquote>
<p>Vermutlich hat er seine eigene Implementierung der STL geschrieben ;).</p>
<p>Nach der Info von hier:<br />
<a href="http://www.cplusplus.com/reference/algorithm/find/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/find/</a></p>
<blockquote>
<p>Return Value<br />
An iterator to the first element in the range that matches value.</p>
</blockquote>
<p>müsste man meiner Meinung nach irgendwas ziemlich falsch machen wenn man den Bereich ganz durchläuft statt nur bis zum ersten Auftreten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868771</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Sun, 14 Mar 2010 14:21:58 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Zeigern nach Adresse von Objekten durchsuchen on Sun, 14 Mar 2010 14:30:25 GMT]]></title><description><![CDATA[<p>Der Anfänger! schrieb:</p>
<blockquote>
<p>Ich möchte eine Methode bauen, das sich Teilnehmer kennen lernen können. Da wollte ich jeweils die Adressen der Bekannten in einen Vector speichern. Aber wieso ist das eine schlechte Idee?</p>
</blockquote>
<p>Weil du dir dadurch verbietest, einen Teilnehmer kopieren zu dürfen. Sobald du kopierst, liegt das Objekt an einer anderen Speicherstelle und die Zeiger unterscheiden sich, obwohl beide Kopien den gleichen Teilnehmer darstellen.</p>
<p>Das kann auch schnell zu einer möglichen Fehlerquelle mutieren. Du wirst die Teilnehmer sicher in irgendeinem Container ablegen, sobald dieser intern die Teilnehmer rumkopiert, ist die Sache schon gelaufen.</p>
<p>Entweder vergleicht man die Objekte direkt, also bietet entsprechende Vergleichsfunktionen an, oder man verwendete IDs, wie zum Beispiel in einer Datenbank. Die Gleichheit über Zeiger festzustellen kann es geben, ist aber meiner Meinung nach eher selten sinnvoll.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868780</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 14 Mar 2010 14:30:25 GMT</pubDate></item></channel></rss>