<?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[1500 struct&#96;s direkt in .cpp in vector schreiben]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Programm geschrieben wo man fragen und antworten in eine Datei schreibt. Jetzt sind dort 1000 Fragen mit antworten...</p>
<p>Da ich diese Fragen mit Antworten aber direkt in die exe datei integrieren möcte, wollte ich hier mal nachfragen ob dies ein Problem geben könnte...</p>
<p>Meine Idee:<br />
Das Programm so abändern das es bei &quot;Save-Datei&quot;, so in die Datei schreibt das es quasi den Quellcode für push.back in den vector:</p>
<p>vorab die struct:</p>
<pre><code class="language-cpp">struct Frage
{   string ask;
    string ant1;
    string ant2;
    string ant3;
    string ant4;
    string ant5;
};

Frage F_tmp;
</code></pre>
<p>so schreibt er die Fragen dann in die Datei (am Beispiel einer Frage mit Antworten):</p>
<pre><code class="language-cpp">T_tmp.ask  = &quot;Frage1&quot;;
T_tmp.ant1 = &quot;antwort1&quot;;
T_tmp.ant2 = &quot;antwort2&quot;;
T_tmp.ant3 = &quot;antwort3&quot;;
T_tmp.ant4 = &quot;antwort4&quot;;
T_tmp.ant5 = &quot;antwort5&quot;;
list.push_back(T_tmp);
</code></pre>
<p>Davon dann das 1500fache will ich in den quellcode direkt einfügen.<br />
Da das unschön ist wollte ich hier nachfragen ob es da probleme geben könnte?<br />
Ich muss es irgendwie hinbekommen das ich nur eine Datei (die exe) benötige um das Programm mit den geladenen Fragen und Antworten zu starten. <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 />
Also datei, datenbank, etc. fällt flach.</p>
<p>Danke für jede Antwort.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/254720/1500-struct-s-direkt-in-cpp-in-vector-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 05:44:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254720.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Nov 2009 07:58:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Fri, 20 Nov 2009 07:58:47 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Programm geschrieben wo man fragen und antworten in eine Datei schreibt. Jetzt sind dort 1000 Fragen mit antworten...</p>
<p>Da ich diese Fragen mit Antworten aber direkt in die exe datei integrieren möcte, wollte ich hier mal nachfragen ob dies ein Problem geben könnte...</p>
<p>Meine Idee:<br />
Das Programm so abändern das es bei &quot;Save-Datei&quot;, so in die Datei schreibt das es quasi den Quellcode für push.back in den vector:</p>
<p>vorab die struct:</p>
<pre><code class="language-cpp">struct Frage
{   string ask;
    string ant1;
    string ant2;
    string ant3;
    string ant4;
    string ant5;
};

Frage F_tmp;
</code></pre>
<p>so schreibt er die Fragen dann in die Datei (am Beispiel einer Frage mit Antworten):</p>
<pre><code class="language-cpp">T_tmp.ask  = &quot;Frage1&quot;;
T_tmp.ant1 = &quot;antwort1&quot;;
T_tmp.ant2 = &quot;antwort2&quot;;
T_tmp.ant3 = &quot;antwort3&quot;;
T_tmp.ant4 = &quot;antwort4&quot;;
T_tmp.ant5 = &quot;antwort5&quot;;
list.push_back(T_tmp);
</code></pre>
<p>Davon dann das 1500fache will ich in den quellcode direkt einfügen.<br />
Da das unschön ist wollte ich hier nachfragen ob es da probleme geben könnte?<br />
Ich muss es irgendwie hinbekommen das ich nur eine Datei (die exe) benötige um das Programm mit den geladenen Fragen und Antworten zu starten. <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 />
Also datei, datenbank, etc. fällt flach.</p>
<p>Danke für jede Antwort.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810809</guid><dc:creator><![CDATA[1500]]></dc:creator><pubDate>Fri, 20 Nov 2009 07:58:47 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Fri, 20 Nov 2009 08:03:07 GMT]]></title><description><![CDATA[<p>1500 schrieb:</p>
<blockquote>
<p>Also datei, datenbank, etc. fällt flach.</p>
</blockquote>
<p>Gibts Gründe?<br />
Grundsätzlich kannst du das machen, ist nur wie diú selbst schon erkannt hast extrem unschön. Ich würd mir an deiner Stelle den immer gleichen Quellcode während des Buildprozess aus einer Datei generieren, wo die Inhalte der einzelnen structs leicht editierbar drin stehen, z.B. aus einer csv-Datei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810810</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 20 Nov 2009 08:03:07 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Fri, 20 Nov 2009 08:22:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ja, im moment stehen die Fragen in einer csv datei, mit &quot;;&quot; getrennt.</p>
<p>Also würdest du sagen das es unschön ist, aber die 10500Zeilen Code der Fragen und Antworten keine Probleme machen dürften!?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810818</guid><dc:creator><![CDATA[1500]]></dc:creator><pubDate>Fri, 20 Nov 2009 08:22:32 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Fri, 20 Nov 2009 08:30:53 GMT]]></title><description><![CDATA[<p>Packe alles, was sowieso an Code feststeht in Dein 'normales' Programm und includiere an der Stelle, wo der vector gefüllt wird ein '#include &quot;Fragen.cpp&quot;'. Der Einfachheit halber kann man auch ein Makro definieren, was dann den Inhalt von 'Fragen.cpp' auf das Notwendigste beschränkt. Also ungefähr:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;string&gt;

struct Frage
{
    Frage( const std::string&amp; ask, 
        const std::string&amp; answer1, const std::string&amp; answer2/*, const std::string&amp; answer2, ..*/ )
        : m_ask( ask )
        , m_answer1( answer1 ), m_answer2( answer2 )/*, m_answer3( answer3 ) ... */
    {}
private:
    std::string m_ask;
    std::string m_answer1, m_answer2 /*, answer3 ...*/ ;
};

#define ADD( f, a1, a2/*, a3, ..*/ ) fragen.push_back( Frage( f, a1, a2/*, a3, ..*/  ) );

std::vector&lt; Frage &gt; fillfragen()
{
    std::vector&lt; Frage &gt; fragen;
#   include &quot;Fragen.cpp&quot;
    return fragen;
}
</code></pre>
<p>und die Datei 'Fragen.cpp' sieht dann so aus:</p>
<pre><code>ADD( &quot;Frage1&quot;, &quot;Antwort1&quot;, &quot;Antwort2&quot;/*, &quot;Antwort3&quot;, ..*/  )
    ADD( &quot;Frage2&quot;, &quot;Antwort1&quot;, &quot;Antwort2&quot;/*, &quot;Antwort3&quot;, ..*/  )
    ADD( &quot;Frage3&quot;, &quot;Antwort1&quot;, &quot;Antwort2&quot;/*, &quot;Antwort3&quot;, ..*/  )
    ADD( &quot;Frage4&quot;, &quot;Antwort1&quot;, &quot;Antwort2&quot;/*, &quot;Antwort3&quot;, ..*/  )
    /*  usw. */
</code></pre>
<p>1500 schrieb:</p>
<blockquote>
<p>Also würdest du sagen das es unschön ist, aber die 10500Zeilen Code der Fragen und Antworten keine Probleme machen dürften!?</p>
</blockquote>
<p>kann schon sein, dass Du irgendwo eine Compiler-Grenze sprengst - einfach ausprobieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810823</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Fri, 20 Nov 2009 08:30:53 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Fri, 20 Nov 2009 08:33:07 GMT]]></title><description><![CDATA[<p>10500 Zeilen Code ist kein Problem. Swig hat mir für mein Projekt bisher &gt;15000 Zeilen in eine Datei geschrieben, und das geht wunderbar prächtig.<br />
Nur ein Unterschied: Hauptsächlich sind das Funktionen, die da generiert wurden.<br />
Bei dir sind es 1500 structs mit je 6 strings, die alle im Speicher liegen! Mit einer DB kannst du dir Zur Laufzeit die Daten holen wie du lustig bist, ohne alles selber im Speicher zu halten. Das erledigt effizient die DB für dich.<br />
SQLite kannst du z.B. statisch in dein Projekt linken. Und eine in-memory-table erzeugen, brauchst also keine Datei mitliefern. Den Code kannst du weiterhin generieren lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810825</guid><dc:creator><![CDATA[?sqlite?]]></dc:creator><pubDate>Fri, 20 Nov 2009 08:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Fri, 20 Nov 2009 10:01:10 GMT]]></title><description><![CDATA[<p>Ja, DB scheidet eben aus...</p>
<p>Die structs sind ja dann über vector im speicher, so sit es auch gewollt.</p>
<p>Dann suche ich von einer Frage die Antworten und gebe diese dann aus.<br />
etwas so:</p>
<pre><code class="language-cpp">Frage ASK::search(string suche_frage)
{   Frage back = F_nofind;
    bool find = false;
    for(it = list.begin(); it != list.end(); ++it)   
    {   F_tmp = *it; 
        if (F_tmp.frage.find(suche_frage)!=string::npos)
        {   back = F_tmp;
            find = true;
        } 
        if(find)
           break;  
    } 
    return back;
}
</code></pre>
<p>Jetzt hoffe ich nur das meine Suchfunktion auch einigermaßen schnell ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810877</guid><dc:creator><![CDATA[Gustl]]></dc:creator><pubDate>Fri, 20 Nov 2009 10:01:10 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Fri, 20 Nov 2009 12:49:48 GMT]]></title><description><![CDATA[<p>Gustl schrieb:</p>
<blockquote>
<p>Jetzt hoffe ich nur das meine Suchfunktion auch einigermaßen schnell ist...</p>
</blockquote>
<p>Ein paar Optimierungsvorschläge:</p>
<pre><code class="language-cpp">// Nimm Const-Referenz als Parameter, also const std::string&amp; suche_frage.
// Damit sparst du dir die unnötige Kopie des std::string-Objektes.
// Zudem empfehle ich Rückgabetyp Frage*, Begründung folgt...
Frage ASK::search(string suche_frage)
{   
    // Wie wäre es mit einem Zeiger, der standardmässig auf Null zeigt?
    // Wenn etwas gefunden wurde, lässt du ihn auf das entsprechende
    // Element zeigen, ansonsten bleibt er ein Nullzeiger.
    // Also Frage* back = 0; wobei back ein schlechter Name ist.
    // So fällt auch das hässliche Dummy-Objekt F_nofind weg.
    Frage back = F_nofind;

    // Dann brauchst du auch dieses find nicht.
    bool find = false;

    // list.end() wird grundsätzlich jede Iteration aufgerufen.
    // Kann zwar sein, dass das wegoptimiert wird, aber mach lieber:
    // for (it = list.begin(), end = list.end(); it != end; ++it)
    // Wo wird eigentlich it deklariert? Mach das lokal in der Schleife.
    for(it = list.begin(); it != list.end(); ++it)   
    {
        // Zuweisung kann vermieden werden: wie gesagt durch Zeiger,
        // also back = &amp;(*it) -&gt; Adresse des Elements holen
        F_tmp = *it; 
        if (F_tmp.frage.find(suche_frage)!=string::npos)
        {
            // ebenfalls Zeiger
            back = F_tmp;

            // dadurch ist das hier auch unnötig, Zeiger ist einfach Null,
            // wenn nichts gefunden wurde.
            find = true;
        } 
        // Die Schleife kannst du gleich in der oberen If-Abfrage verlassen.
        if(find)
           break;  
    } 
    // Hier Zeiger zurückgeben.
    return back;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1810968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810968</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 20 Nov 2009 12:49:48 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Mon, 23 Nov 2009 14:21:54 GMT]]></title><description><![CDATA[<p>Danke, habe die Funktion verbessert. <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>Und dann habe ich noch eine list als rückgabewert eingebaut, jetzt bricht er nicht ab, sondern fügt alle gefundenen in die List ein und gibt sie zurück, vielleicht sollte ich da auch einen zeiger als rückgabewert nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812359</guid><dc:creator><![CDATA[Gustl]]></dc:creator><pubDate>Mon, 23 Nov 2009 14:21:54 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Mon, 23 Nov 2009 18:37:56 GMT]]></title><description><![CDATA[<p>Gustl schrieb:</p>
<blockquote>
<p>Danke, habe die Funktion verbessert. <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>Und dann habe ich noch eine list als rückgabewert eingebaut, jetzt bricht er nicht ab, sondern fügt alle gefundenen in die List ein und gibt sie zurück, vielleicht sollte ich da auch einen zeiger als rückgabewert nehmen?</p>
</blockquote>
<p>Zeiger auf was? Ein lokales Objekt? Nein, das lass mal lieber. <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="😉"
    /><br />
Die Rückgabe per Kopie ist schon in Ordnung, da hier unter Umständen eh so optimiert wird, dass kein kopieren geschieht.</p>
<p>Um sicher zu gehen, dass nichts kopiert wird, könntest du ja auch eine Referenz auf die Liste übergeben, welche du dann befüllst. Dann wird da bestimmt nichts kopiert, ist allerdings ein eher altmodischer Stil. (erinnert mich an die WinAPI ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812531</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 23 Nov 2009 18:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Mon, 23 Nov 2009 18:48:58 GMT]]></title><description><![CDATA[<p>Besser als Kopieren und exception safer ( <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> ) als in Referenz schreiben wäre noch die Übergabe in einem smart pointer.<br />
Auch mit Return value optimization wird eine Kopie bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812541</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Mon, 23 Nov 2009 18:48:58 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Mon, 23 Nov 2009 19:19:54 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Besser als Kopieren und exception safer ( <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> ) als in Referenz schreiben wäre noch die Übergabe in einem smart pointer.<br />
Auch mit Return value optimization wird eine Kopie bleiben.</p>
</blockquote>
<p>Meinst du die Rückgabe eines Smart Pointers?</p>
<p>Warum meinst du, dass eine Kopier bleiben muss?</p>
<p>Laut dem Artikel hier:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms364057%28VS.80%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms364057(VS.80).aspx</a></p>
<p>Ist das ja genau der Sinn eine solche Kopie zu vermeiden. Exceptionsafe wäre es das ganze dann ja auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812567</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 23 Nov 2009 19:19:54 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Mon, 23 Nov 2009 19:55:06 GMT]]></title><description><![CDATA[<p>Gustl schrieb:</p>
<blockquote>
<p>Und dann habe ich noch eine list als rückgabewert eingebaut [...] vielleicht sollte ich da auch einen zeiger als rückgabewert nehmen?</p>
</blockquote>
<p>Nein, Zeiger bzw. Referenzen solltest du als Verweise auf etwas Bestehendes verwenden. Zum Beispiel auf Objekte in der Liste, die auch nach dem Funktionsaufruf erhalten bleiben. Lokale Objekte werden am Ende der Funktion zerstört, Verweise darauf sind sehr gefährlich.</p>
<p>Aber zeig doch sonst mal die momentane Funktion... <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>brotbernd schrieb:</p>
<blockquote>
<p>exception safer [...] als in Referenz schreiben wäre noch die Übergabe in einem smart pointer.</p>
</blockquote>
<p>Wieso ist ein Smart-Pointer exceptionsicherer als ein Referenzparameter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812593</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 23 Nov 2009 19:55:06 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Mon, 23 Nov 2009 20:36:00 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>brotbernd schrieb:</p>
<blockquote>
<p>exception safer [...] als in Referenz schreiben wäre noch die Übergabe in einem smart pointer.</p>
</blockquote>
<p>Wieso ist ein Smart-Pointer exceptionsicherer als ein Referenzparameter?</p>
</blockquote>
<p>Na, mach mal die inserts, die du schon gemacht hast wieder rückgängig. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812616</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 23 Nov 2009 20:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Mon, 23 Nov 2009 22:30:25 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Na, mach mal die inserts, die du schon gemacht hast wieder rückgängig. <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="😉"
    /></p>
</blockquote>
<p>Gerne <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">ref_list.clear();
</code></pre>
<p>Ein Algorithmus, der einen Container füllt, darf wohl davon ausgehen, dass dieser zuvor leer ist. Bei der Smart-Pointer-Rückgabe hat man ja vorher auch nichts.</p>
<p>Aber selbst falls der Container bereits Elemente enthält, gibts immer noch den Swap-Trick. Dabei ist ein Vergleich mit der Smart-Pointer-Lösung aber abwegig.</p>
<pre><code class="language-cpp">std::list&lt;T&gt; new_list(ref_list); // kann fehlschlagen
// hier weiter füllen; kann auch fehlschlagen
std::swap(new_list, ref_list);
</code></pre>
<p>Oder man merkt sich, wieviele Elemente bereits vorher drin waren und löscht den Rest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812667</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 23 Nov 2009 22:30:25 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Tue, 24 Nov 2009 11:46:32 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Na, mach mal die inserts, die du schon gemacht hast wieder rückgängig. <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="😉"
    /></p>
</blockquote>
<p>Gerne <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">ref_list.clear();
</code></pre>
<p>Ein Algorithmus, der einen Container füllt, darf wohl davon ausgehen, dass dieser zuvor leer ist. Bei der Smart-Pointer-Rückgabe hat man ja vorher auch nichts.</p>
</blockquote>
<p>Hmm. Muss imo nicht unbedingt sein.. Aber das kommt wohl auf das Anwendungsbeispiel an.</p>
<p>Klar geht es immernoch, aber naja. Ich finde es einiges natürlicher da eine Rückgabe zu haben, als irgendwas erzwingen zu wollen, was schlechter zu bedienen ist.</p>
<p>Aber in deinem Beispiel hat man ja auch wieder eine Kopie, was wir ja nicht wollten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812816</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 24 Nov 2009 11:46:32 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Tue, 24 Nov 2009 16:20:39 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a><br />
Gut, du hast recht, so pauschal kann man das nicht behaupten. Was wie sicher ist (oder überhaupt sicher sein muss) hängt natürlich von der Funktion und evtl. side effects ab.<br />
Allerdings gefällt es mir nicht so, wenn eine Funktion Annahmen über ihre Benutzung treffen muss. Wenn sich eine falsche Bedienung vermeiden lässt, dann mach ich das auch. Sonst wundert man sich 2Jahre später vielleicht wo die Hälfte seiner Liste hingeschwappt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812985</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 24 Nov 2009 16:20:39 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Tue, 24 Nov 2009 18:51:50 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Klar geht es immernoch, aber naja. Ich finde es einiges natürlicher da eine Rückgabe zu haben, als irgendwas erzwingen zu wollen, was schlechter zu bedienen ist.</p>
</blockquote>
<p>Klar, die Funktion kann schlechter zu bedienen sein. Dafür ist sie flexibler, weil sie einen nicht zur Heap-Allokation zwingt. Aber wie du sagst, hängt es von den gegebenen Umständen ab.</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Aber in deinem Beispiel hat man ja auch wieder eine Kopie, was wir ja nicht wollten.</p>
</blockquote>
<p>Hat man nur, wenn man die vorherigen Elemente bewahren will (nicht einmal da zwingend). Das war eigentlich nicht die Voraussetzung, weil die Smart-Pointer-Rückgabe diese Funktionalität auch nicht erfüllt.</p>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Allerdings gefällt es mir nicht so, wenn eine Funktion Annahmen über ihre Benutzung treffen muss. Wenn sich eine falsche Bedienung vermeiden lässt, dann mach ich das auch.</p>
</blockquote>
<p>Preconditions festzulegen ist Aufgabe vieler Funktionen. Gegebenenfalls werden Fehler zur Laufzeit abgefangen (z.B. Exceptions oder je nach Fall Assertions), das muss jedoch nicht sein. Beispiele in C sind nahezu alle Stringverarbeitungsfunktionen, denen du keinen Nullzeiger übergeben darfst. Ein Beispiel in C++ ist die STL, die sich für gewisse Operationen auf Strict Weak Ordering verlässt (du würdest noch viel mehr finden, ist mir nur gerade eingefallen).</p>
<p>Aber mit der falschen Bedienung hast du völlig Recht, das handhabe ich meist auch so. Oft kann man alleine durch die Schnittstelle schon recht viel aussagen. Allerdings ziehe ich irgendwo auch die Grenzen und setze auf gesunden Menschenverstand, schliesslich darf man auch die Dokumentation lesen. <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="😉"
    /></p>
<p>Hier ist das wohl so ein Streitfall. Ich bin zwar der Meinung, dass bei</p>
<pre><code class="language-cpp">// Durchsucht ... und speichert die Ergebnisse in results
void FindXYZ(std::list&lt;std::string&gt;&amp; results);
</code></pre>
<p>klar ist, dass <code>results</code> lediglich die Suchresultate hält...</p>
<p>Naja, mit C++0x und Move-Semantik ist das Thema eh vom Tisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813064</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 24 Nov 2009 18:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Tue, 24 Nov 2009 18:59:41 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Klar geht es immernoch, aber naja. Ich finde es einiges natürlicher da eine Rückgabe zu haben, als irgendwas erzwingen zu wollen, was schlechter zu bedienen ist.</p>
</blockquote>
<p>Klar, die Funktion kann schlechter zu bedienen sein. Dafür ist sie flexibler, weil sie einen nicht zur Heap-Allokation zwingt. Aber wie du sagst, hängt es von den gegebenen Umständen ab.</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Aber in deinem Beispiel hat man ja auch wieder eine Kopie, was wir ja nicht wollten.</p>
</blockquote>
<p>Hat man nur, wenn man die vorherigen Elemente bewahren will (nicht einmal da zwingend). Das war eigentlich nicht die Voraussetzung, weil die Smart-Pointer-Rückgabe diese Funktionalität auch nicht erfüllt.</p>
</blockquote>
<p>Also ich bin davon ausgegangen, dass an die Funktion eine Liste (nicht unbedingt leer) übergeben wird. Und dann kann man da nicht einfach auf leer setzen. Wenn man also die Einträge sicher haben will, kommt man auf eine Teilweise Kopier nicht herum.<br />
Wenn man andere Anforderungen hat und kann man das ganze natürlich noch weiter optimieren. Aber ich habe gemeint, dass man die Liste dann einfach per Kopie zurückgibt, also auch ohne eine Heap Allokation und Smart Pointer.</p>
<p>Also ganz einfach per Kopie zurückgeben und auf RVA hoffen, wie ich immer noch der Meinung bin, dass es hier ziehen müsste. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813067</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 24 Nov 2009 18:59:41 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Wed, 25 Nov 2009 14:20:34 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Gustl schrieb:</p>
<blockquote>
<p>Und dann habe ich noch eine list als rückgabewert eingebaut [...] vielleicht sollte ich da auch einen zeiger als rückgabewert nehmen?</p>
</blockquote>
<p>Nein, Zeiger bzw. Referenzen solltest du als Verweise auf etwas Bestehendes verwenden. Zum Beispiel auf Objekte in der Liste, die auch nach dem Funktionsaufruf erhalten bleiben. Lokale Objekte werden am Ende der Funktion zerstört, Verweise darauf sind sehr gefährlich.</p>
<p>Aber zeig doch sonst mal die momentane Funktion... <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>
</blockquote>
<p>Hallo,</p>
<p>ja, ich würde dann halt private die liste in der Klasse erstellen und darauf einen pointer zurückgeben.</p>
<p>die momentane Funktion schaut jetzt so aus:</p>
<pre><code class="language-cpp">vector&lt;Frage&gt; ASK::search(string &amp;suche_frage)
{   list_answers.clear();
    vector&lt;Frage&gt;::iterator it;
    for (it = list.begin(), end = list.end(); it != end; ++it)
    {   if((*it).frage.find(suche_frage)!=string::npos)
           list_answers.push_back(*it);
    }
    if(list_answers.empty())
       list_answers.push_back(F_nofind);

    return list_answers;
}
</code></pre>
<p>Frage:<br />
warum soll ich die Schleife so schreiben:</p>
<pre><code class="language-cpp">for (it = list.begin(), end = list.end(); it != end; ++it)
</code></pre>
<p>anstatt so:</p>
<pre><code class="language-cpp">for(it = list.begin(); it != list.end(); ++it)
</code></pre>
<p>?<br />
Und warum soll ich den iterator nicht in der klasse selbst definieren, das geschieht ja dann jedes mal bei funktionsaufruf...?</p>
<p>Zu der Diskussion SmartPointer kann ich leider nichts sagen, weil ich nicht weiß was das ist!? <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="😃"
    /></p>
<p>Danke<br />
Gruß<br />
Gustl</p>
<p>Edit:<br />
P.S.: Ich habe die Funktion mit einer Geschwindigkeitsmessfunktion im builder gemessen und bin gerade mal auf 0,0004 sec. gekommen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813334</guid><dc:creator><![CDATA[Gustl]]></dc:creator><pubDate>Wed, 25 Nov 2009 14:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Wed, 25 Nov 2009 18:27:58 GMT]]></title><description><![CDATA[<p>Ich finde die Funktion gut und recht verständlich, bis auf ein paar Details:</p>
<pre><code class="language-cpp">vector&lt;Frage&gt; ASK::search(const string &amp;suche_frage) //const damit der User weiss, dass da sicher nichts verändert wird
{   list_answers.clear();
    vector&lt;Frage&gt;::iterator it;
    for (it = list.begin(), end = list.end(); it != end; ++it)
    {   if((*it).frage.find(suche_frage)!=string::npos)
           list_answers.push_back(*it);
    }
    if(list_answers.empty())
       list_answers.push_back(F_nofind); // das verstehe ich nicht ganz.  Wenn die Liste leer ist, heisst das doch,
                                         // dass nichts gefunden worden ist, oder? Und wie ist F_nofind definiert? 
                                         // Könnte es nicht durch einen blöden Zufall genau dieser Wert in die Liste gepusht werden?

    return list_answers;
}
</code></pre>
<p>Das end machst du dort, damit es nicht in jedem Schleifendurchlauf neu evaluiert werden muss.</p>
<p>Über Smart Pointer findest du sehr viel, wenn du mal danach googelst. Grundsätzlich geht es darum die Ownership von Dynamischen Ressourcen zu verwalten. (Wer ist für das Aufräumen verantwortlich, wann wird kopiert und wann nur auf den gleichen Bereich referenziert usw.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813495</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 25 Nov 2009 18:27:58 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Wed, 25 Nov 2009 18:38:55 GMT]]></title><description><![CDATA[<p>Ok, jetzt verstehe ich das mit dem end. thx</p>
<p>im no_find steht fest als ant1 = &quot;FRAGE NICHT GEFUNDEN&quot;<br />
da er ja woanderst dann die gefunden Antworten ausgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813504</guid><dc:creator><![CDATA[Gustl]]></dc:creator><pubDate>Wed, 25 Nov 2009 18:38:55 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Wed, 25 Nov 2009 18:44:18 GMT]]></title><description><![CDATA[<p>Hmm. OK. Kann man so machen. (Auch wenn ichs ein wenig suspekt finde, aber ist wahrscheinlich einfacher, als etwas anderes..)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813508</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 25 Nov 2009 18:44:18 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Wed, 25 Nov 2009 18:53:41 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Hmm. OK. Kann man so machen. (Auch wenn ichs ein wenig suspekt finde, aber ist wahrscheinlich einfacher, als etwas anderes..)</p>
</blockquote>
<p>find ich allg. nicht.. ich würd ne const-ref zurückgeben(man will ja nix in den antworten rumschreiben und es scheint ein element der klasse zu sein)</p>
<p>und in der fkt würd ich nicht auf empty prüfen sondern halt außerhalb... ist nicht schwerer aber wesentlich übersichtlicher...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813517</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 25 Nov 2009 18:53:41 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Wed, 25 Nov 2009 19:07:25 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Hmm. OK. Kann man so machen. (Auch wenn ichs ein wenig suspekt finde, aber ist wahrscheinlich einfacher, als etwas anderes..)</p>
</blockquote>
<p>find ich allg. nicht.. ich würd ne const-ref zurückgeben(man will ja nix in den antworten rumschreiben und es scheint ein element der klasse zu sein)</p>
</blockquote>
<p>Das verstehe ich nicht ganz. Was willst du wo zurückgeben?</p>
<blockquote>
<p>und in der fkt würd ich nicht auf empty prüfen sondern halt außerhalb... ist nicht schwerer aber wesentlich übersichtlicher...</p>
</blockquote>
<p>Darauf wollte ich hinaus und würde es wahrscheinlich auch eher so lösen, aber ich denke mir, dass er da so etwas, wie <code>output_answers()</code> hat und dann wird halt, wenn nix gefunden wird der Text ausgegeben, ohne auf noch irgendetwas zu prüfen oder so. Ist natürlich nicht sehr sauber, wenn man dann z.B im Code mal prüfen möchte, ob jetzt was gefunden worden ist, oder nicht. Dann muss man das erste Element der Liste nehmen und da mittels String Vergleich etwas überprüfen. Finde ich sehr unschön. Aber naja.. Wenn das andere genau seine Anforderungen erfüllt, warum nicht?<br />
Das ganze schöner zu machen ist nicht direkt schwerer, oder komplizierter, aber sicher ein wenig mehr Aufwand, den man nicht ubedingt haben will, wenn man nur ein paar Anforderungen zu erfüllen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813526</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 25 Nov 2009 19:07:25 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Wed, 25 Nov 2009 19:12:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">vector&lt;Frage&gt; ASK::search(const string &amp;suche_frage) //const damit der User weiss, dass da sicher nichts verändert wird 
{
  list_answers.clear(); 

//...

  return list_answers; 
}
</code></pre>
<p>legt den verdacht nahe, dass list_answers vom typ vector&lt;Frage&gt; ist und ein member der klasse ASK ist...<br />
ich fänds bequem, wenn ich selbst entscheiden könnte, ob der rückgabewert kopiert werden soll oder nicht:<br />
<code>std::copy(ask.search(&quot;asd&quot;).begin(), ask.search(&quot;asd&quot;).end(), std::ostream_iterator&lt;Frage&gt;(std::cout, &quot;\r\n&quot;));</code><br />
(grad ein wenig ein doofes bsp., aber allg. sehe ich keinen grund, etwas, was so und so nie verändert wird, per value zurückzugeben - oder siehst du die notwendigkeit, diesen wert jemals verändern zu wollen?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813532</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 25 Nov 2009 19:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to 1500 struct&#96;s direkt in .cpp in vector schreiben on Wed, 25 Nov 2009 19:25:32 GMT]]></title><description><![CDATA[<p>Hmm. Ok, jetzt sehe ich, was du meinst.<br />
Ja, wenn das sowieso eine Member der Klasse ist und man da die Antworten reinschreibt, dann liegt es nahe, dass man eine const Referenz auf das interne Objekt zurückgibt.<br />
Eine andere Frage wäre dann aber natürlich, ob es Sinn macht (abgesehen von Optimierungsgedanken) die Liste intern zu halten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813542</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 25 Nov 2009 19:25:32 GMT</pubDate></item></channel></rss>