<?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[Suche mittels find&#x2F;find_if]]></title><description><![CDATA[<p>Hi,</p>
<p>folgende Aufgabenstellung:<br />
Ich habe eine Klasse CMyObj mit einem Member std::string m_Name.<br />
Weiterhin habe ich einen std::vector&lt;CMyObj*&gt;, in dem ich jetzt das CMyObj-Element finden möchte, dessen m_Name-Member mit einem vorgegebenen CString übereinstimmt. (Dieser vorgegebene String, gehört wieder zu einem Objekt einer anderen Klasse und steht erst zur Laufzeit fest).</p>
<p>Da ich mit &quot;find&quot; hier nichts anfangen kann(?), wollte ich find_if verwenden, tue mir aber mit der Definition des &quot;predicate&quot; ein wenig schwer.</p>
<p>Wenn ich es richtig verstehe, brauche ich als drittes Argument von find_if eine Funktion/einen Funktor, die/der in meinem Fall ein CMyObj* nimmt und ein bool zurückgibt.<br />
Wie ich dann den zu findenden String mit ins Spiel bringen soll, ist mir nicht ganz klar, da ich ihn der Funktion nicht zusätzlich übergeben kann und von innerhalb der Funktion keinen Zugriff habe...</p>
<p>Folgend ein paar Code-Auszüge, die vielleicht die Aufgabe ein wenig verdeutlichen.</p>
<pre><code class="language-cpp">// Ich habe einen vector &quot;data&quot;, der mit Objekten einer struct gefüllt ist.
// Ein Member dieser struct ist der zu suchende String
std::vector&lt;myStruct&gt; data = //...    
std::vector&lt;myStruct&gt;::iterator dataIter = data.begin();

std::vector&lt;CMyObj*&gt;::iterator result;
while(dataIter != data.end())
{
    // Außerdem habe ich den zu durchsuchenden vector &quot;m_myObjects&quot;, der mit CMyObj* gefüllt ist
    result = find_if(m_myObjects.begin(), m_myObjects.end(), /*???*/);
    // do something with result
    ++dataIter;
}
</code></pre>
<p>In jedem Schleifendurchlauf greife ich mir also ein Element aus dem vector &quot;data&quot; heraus. Das string-Member des aktuellen vector-Elements ist der string, nach dem ich suche.<br />
Ich durchsuche dann den vector m_myObjects nach diesem string, wobei er dort nicht direkt enthalten ist, sondern in Form eines Members der im vector enthaltenen Elemente.</p>
<p>Anstelle von &quot;???&quot; sollte also oben etwas stehen wie:<br />
<em>&quot;Wennn folgende Bedingung erfüllt ist, ist das gesuchte Element gefunden&quot;</em>:</p>
<pre><code class="language-cpp">(*dataIter).m_StringToSearchFor == &quot;aktuell betrachtetes Element von m_myObjects&quot;-&gt;GetName()
</code></pre>
<p>Ich hoffe, ich habe mein Problem einigermaßen verständlich erläutert. Würde mich über ein wenig Hilfestellung freuen.<br />
Vielen Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179448/suche-mittels-find-find_if</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 06:20:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179448.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 Apr 2007 20:52:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Suche mittels find&#x2F;find_if on Sun, 22 Apr 2007 00:06:19 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>folgende Aufgabenstellung:<br />
Ich habe eine Klasse CMyObj mit einem Member std::string m_Name.<br />
Weiterhin habe ich einen std::vector&lt;CMyObj*&gt;, in dem ich jetzt das CMyObj-Element finden möchte, dessen m_Name-Member mit einem vorgegebenen CString übereinstimmt. (Dieser vorgegebene String, gehört wieder zu einem Objekt einer anderen Klasse und steht erst zur Laufzeit fest).</p>
<p>Da ich mit &quot;find&quot; hier nichts anfangen kann(?), wollte ich find_if verwenden, tue mir aber mit der Definition des &quot;predicate&quot; ein wenig schwer.</p>
<p>Wenn ich es richtig verstehe, brauche ich als drittes Argument von find_if eine Funktion/einen Funktor, die/der in meinem Fall ein CMyObj* nimmt und ein bool zurückgibt.<br />
Wie ich dann den zu findenden String mit ins Spiel bringen soll, ist mir nicht ganz klar, da ich ihn der Funktion nicht zusätzlich übergeben kann und von innerhalb der Funktion keinen Zugriff habe...</p>
<p>Folgend ein paar Code-Auszüge, die vielleicht die Aufgabe ein wenig verdeutlichen.</p>
<pre><code class="language-cpp">// Ich habe einen vector &quot;data&quot;, der mit Objekten einer struct gefüllt ist.
// Ein Member dieser struct ist der zu suchende String
std::vector&lt;myStruct&gt; data = //...    
std::vector&lt;myStruct&gt;::iterator dataIter = data.begin();

std::vector&lt;CMyObj*&gt;::iterator result;
while(dataIter != data.end())
{
    // Außerdem habe ich den zu durchsuchenden vector &quot;m_myObjects&quot;, der mit CMyObj* gefüllt ist
    result = find_if(m_myObjects.begin(), m_myObjects.end(), /*???*/);
    // do something with result
    ++dataIter;
}
</code></pre>
<p>In jedem Schleifendurchlauf greife ich mir also ein Element aus dem vector &quot;data&quot; heraus. Das string-Member des aktuellen vector-Elements ist der string, nach dem ich suche.<br />
Ich durchsuche dann den vector m_myObjects nach diesem string, wobei er dort nicht direkt enthalten ist, sondern in Form eines Members der im vector enthaltenen Elemente.</p>
<p>Anstelle von &quot;???&quot; sollte also oben etwas stehen wie:<br />
<em>&quot;Wennn folgende Bedingung erfüllt ist, ist das gesuchte Element gefunden&quot;</em>:</p>
<pre><code class="language-cpp">(*dataIter).m_StringToSearchFor == &quot;aktuell betrachtetes Element von m_myObjects&quot;-&gt;GetName()
</code></pre>
<p>Ich hoffe, ich habe mein Problem einigermaßen verständlich erläutert. Würde mich über ein wenig Hilfestellung freuen.<br />
Vielen Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1270823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1270823</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Sun, 22 Apr 2007 00:06:19 GMT</pubDate></item><item><title><![CDATA[Reply to Suche mittels find&#x2F;find_if on Sat, 21 Apr 2007 23:30:03 GMT]]></title><description><![CDATA[<ol>
<li>Da du in deinem Container Pointer speicherst, sind einige Dinge anders als sie sonst wären (Toller Satz, was <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> )</li>
<li>Du kannst als &quot;predicate&quot; nicht einfach ne Memberfunktion übergeben die noch dazu noch Parameter erwartet, du musst schon nen passendes &quot;function object&quot; aka Funktor übergeben:</li>
</ol>
<pre><code class="language-cpp">class CMyObj
{
public:
    //...
    bool IsItsName(const std::string&amp; name) const;
};

// unser Funktor:
class CompareCMyObjName
{
public:
    CompareCMyObjName(std::string const&amp; name)
        : m_name(name)
    {}

    // für ein &quot;unary predicate&quot; wie es find_if verlangt müssen wir einen
    // &quot;bool operator ()(...)&quot; definieren, der den Aufruf &quot;f(*it)&quot; ermöglicht,
    // wenn &quot;f&quot; die Instanz des Funktors ist und &quot;it&quot; der Iterator:
    bool operator () (CMyObj* p)
    {
        return p-&gt;IsItsName(m_name);
    }

private:
    std::string m_name;
};

void foo()
{
    std::vector&lt;CMyObj*&gt; v;
    // ... fill v ...

    // und so geht's dann:
    CompareCMyObjName pred(&quot;hans&quot;);
    std::find_if(v.begin(), v.end(), pred);

    // oder kürzer:
    std::find_if(v.begin(), v.end(), CompareCMyObjName(&quot;hans&quot;));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1270877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1270877</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 21 Apr 2007 23:30:03 GMT</pubDate></item><item><title><![CDATA[Reply to Suche mittels find&#x2F;find_if on Sun, 22 Apr 2007 00:19:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a><br />
Jetzt habe ich an meinem ursprünglichen Beitrag eine ganze Weile herumeditiert, weil mir ein paar Dinge klar geworden sind und ich dachte, das schaut sich um diese Zeit ohnehin keiner mehr an. In der Zwischenzeit kam deine Antwort, die jetzt nicht mehr 100%ig zu meinem Beitrag passt. Sorry dafür!</p>
<p>Trotzdem vielen Dank für die Antwort!<br />
Ich denke, ich habe es einigermaßen begriffen, werde es mir aber noch einmal in Ruhe anschauen müssen, bevor ich es ausprobiere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1270885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1270885</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Sun, 22 Apr 2007 00:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to Suche mittels find&#x2F;find_if on Sun, 22 Apr 2007 04:50:48 GMT]]></title><description><![CDATA[<p>Hmm, ich bin mir jetzt mit dem folgenden wie fast immer nicht ganz sicher:</p>
<p>(std:: lass ich überall weg, fügs hinzu wo's sein muss, falls du kein using namespace std; nutzt)</p>
<pre><code class="language-cpp">struct Comperator{    //sinnvolleren Namen einfallen lassen
    bool operator()(const CMyObj&amp; obj,const string&amp; s){   
        return obj.m_name==s;    //falls m_name private den struct hier als friend deklarieren
    }
};
</code></pre>
<pre><code class="language-cpp">while(dataIter != data.end())
{
    result = find_if(m_myObjects.begin(), m_myObjects.end(),bind2nd(Comperator(),dataIter-&gt;m_StringToSearchFor)); //Unsicherheit bez. der Klammern bei Comperator
    // do something with result
    ++dataIter;
}
</code></pre>
<p>Vielleicht funktionniert es. Ich hätts so probiert zumindest. Kannst es ja mal versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1270892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1270892</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Sun, 22 Apr 2007 04:50:48 GMT</pubDate></item><item><title><![CDATA[Reply to Suche mittels find&#x2F;find_if on Sun, 22 Apr 2007 12:07:56 GMT]]></title><description><![CDATA[<p>Hier <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Anschauen und verstehen <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

class MyClass {

           string name;
   public: 
           MyClass(const string&amp; n) : name(n) { }
           string getName() const { return name; }
};

struct MyStruct {
       string stringToSearch;
       MyStruct(const string&amp; n) : stringToSearch(n) { }
};

bool operator==( const MyClass* ob1, const MyStruct&amp; ob2)
{
     return ob1-&gt;getName() == ob2.stringToSearch;
}

int main()
{
    vector&lt;MyStruct&gt; vec_struct;

    vec_struct.push_back(MyStruct(&quot;Hey&quot;));
    vec_struct.push_back(MyStruct(&quot;maus&quot;));    

    vector&lt;MyClass*&gt; vec_class;

    vec_class.push_back(new MyClass(&quot;Hey&quot;));
    vec_class.push_back(new MyClass(&quot;lolo&quot;));
    vec_class.push_back(new MyClass(&quot;maus&quot;));

    for(vector&lt;MyStruct&gt;::iterator it = vec_struct.begin(); it != vec_struct.end(); ++it)
    {
          vector&lt;MyClass*&gt;::iterator result = find(vec_class.begin(),vec_class.end(),*it);
/*
find versucht ein MyClass* mit einem MyStruct zu vergleichen, deswegen braucht man nen op== dafür
*/
          cout &lt;&lt; (*result)-&gt;getName() &lt;&lt; endl;                                
    }

    // vec_class aufräumen

    cin.get();

    return 0;
}
</code></pre>
<p>Hoffe mal das war das was du wolltst ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271061</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 22 Apr 2007 12:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to Suche mittels find&#x2F;find_if on Sun, 22 Apr 2007 12:47:41 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a><br />
Deinen Vorschlag habe ich inzwischen umgesetzt. So funktioniert es. Danke noch mal!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13317">@shinja</a><br />
Danke auch dir für die Antwort.<br />
Bevor ich überhaupt eine Antwort bekommen hatte, habe ich auch einmal mit bind1st/bind2nd herumexperimentiert und versucht aus einem Funktor (bzw. dessen operator()), der zwei Argumente nahm, einen unären zu machen. Hintergrund war ein Beispiel, das ich zu find_if gefunden hatte, bei dem als drittes Argument folgendes übergeben wurde:</p>
<pre><code class="language-cpp">std::bind2nd(std::less&lt;int&gt;(), 1000))
</code></pre>
<p>Allerdings bin ich kläglich gescheitert als ich das auf meinen Fall übertragen wollte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> .<br />
Ich glaube zwar, dass das sehr ähnlich zu dem war, was du jetzt vorschlägst, aber vielleicht probiere ich es trotzdem noch einmal.</p>
<p>@KasF<br />
Das ist zwar auch ein interessanter Ansatz, allerdings würde ich damit Gleichheit zweier Objekte unterschiedlicher Klassen definieren, sofern <strong>eine</strong> ihrer Member-Variablen übereinstimmt. Beide Klassen verfügen aber noch über einige andere Member und ich würde somit Objekte vergleichen, die sehr unterschiedlicher Art und eigentlich nicht vergleichbar sind.<br />
Trotzdem danke für den Hinweis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271082</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Sun, 22 Apr 2007 12:47:41 GMT</pubDate></item><item><title><![CDATA[Reply to Suche mittels find&#x2F;find_if on Sun, 22 Apr 2007 13:23:00 GMT]]></title><description><![CDATA[<p>Würde mich freuen wenn du es nochmal ausprobieren und mir sagen würdest, woran es scheitert. Hilft mir auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271103</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Sun, 22 Apr 2007 13:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to Suche mittels find&#x2F;find_if on Sun, 22 Apr 2007 18:26:23 GMT]]></title><description><![CDATA[<p>Nanuq schrieb:</p>
<blockquote>
<p>Das ist zwar auch ein interessanter Ansatz, allerdings würde ich damit Gleichheit zweier Objekte unterschiedlicher Klassen definieren</p>
</blockquote>
<p>Stimmt, hast vollkommen Recht. Hab daran gar nicht gedacht ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271346</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 22 Apr 2007 18:26:23 GMT</pubDate></item></channel></rss>