<?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[Tipps zu meinem C++ code]]></title><description><![CDATA[<p>Hi,</p>
<p>und zwar sollte ich für eine Firma einen Test mitmachen. Die Reaktion war, dass mein Code reicht für nen Praktikum aber für ne feste Stelle würde es nicht reichen. Mir wurde auch das Buch &quot;Effective C++ Third Edition van Scott Meyers&quot; empfohlen. Nur was jetzt genau nicht gut war, habe ich nicht erfahren. Somit dacht ich mir, vllt könnt ihr mir helfen und sagen, wie es anders besser wäre <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="😃"
    /><br />
Aufgabe war es eine Textdatei (config datei) einzulesen, worin verschiedene andere Textdateien stehen, diese müssen dann eingelesen werden. Und der user gibt an welches Wort er sucht. Das Programm soll dann ausgeben wie oft das Wort in welcher Datei (case(in)sensitive) vorkommt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;list&gt;
#include &lt;map&gt;
#include &lt;algorithm&gt;
#include &lt;sstream&gt;

using namespace std;

map&lt;string, vector&lt;string&gt; &gt; textFiles; // map with filenames and textfile content

vector&lt;string&gt; getFileContent(string fileName);  // returns content of file with given name
void searchForWords();  // ask user for string to be counted
string lower(string old);   // changes string to lower case

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        cerr &lt;&lt; &quot;usage: &quot; &lt;&lt; argv[0] &lt;&lt; &quot; config-Filename&quot; &lt;&lt; endl;
        exit(1);
    }

    string fileName = argv[1];          // get name of config file
    ifstream file (fileName.c_str());   // file to read

    if (file)
    {
        while (!file.eof())
        {
            string buffer;
            getline(file, buffer);
            textFiles[buffer] = getFileContent(buffer); // get vector with file content and store it in map
        }

        file.close();
        searchForWords();
    }
    else
    {
        cerr &lt;&lt; &quot;cannot open file &quot; &lt;&lt; fileName &lt;&lt; endl;
        exit(1);
    }

    return 0;
}

void searchForWords()
{
    bool running = true;
    while (running)
    {
        cout &lt;&lt; &quot;Specify a string to be counted (q = quit):&quot;;
        string input;
        cin &gt;&gt; input;

        if (input != &quot;q&quot; )
        {
            int counterSensitive = 0;
            int counterInsensitive = 0;
            string fileStringSen;
            string fileStringInsen;
            for (map&lt;string, vector&lt;string&gt; &gt;::const_iterator i = textFiles.begin(); i != textFiles.end(); ++i)
            {
                vector&lt;string&gt; words = i-&gt;second;
                string curTextFile = i-&gt;first;
                int fileCounterSen = 0;
                int fileCounterInsen = 0;
                for (vector&lt;string&gt;::const_iterator j = words.begin(); j != words.end(); ++j)
                {
                    if (*j  == input)
                    {
                        counterSensitive++;
                        fileCounterSen++;
                    }
                    if (lower(*j) == lower(input))
                    {
                        counterInsensitive++;
                        fileCounterInsen++;
                    }
                }
                if (fileCounterSen &gt; 0)
                {
                    stringstream ss; //create a stringstream
                    ss &lt;&lt; curTextFile &lt;&lt; &quot;: &quot; &lt;&lt; fileCounterSen &lt;&lt; endl;
                    fileStringSen += ss.str();
                }
                if (fileCounterInsen &gt; 0)
                {
                    stringstream ss; //create a stringstream
                    ss &lt;&lt; curTextFile &lt;&lt; &quot;: &quot; &lt;&lt; fileCounterInsen &lt;&lt; endl;
                    fileStringInsen += ss.str();
                }
            }

            cout &lt;&lt; &quot;-- Case sensitive --&quot; &lt;&lt; endl;
            cout &lt;&lt; &quot;Overall: &quot; &lt;&lt; counterSensitive&lt;&lt; endl;
            cout &lt;&lt; fileStringSen;

            cout &lt;&lt; &quot;-- Case insensitive --&quot; &lt;&lt; endl;
            cout &lt;&lt; &quot;Overall: &quot; &lt;&lt; counterInsensitive &lt;&lt; endl;
            cout &lt;&lt; fileStringInsen;
            cout &lt;&lt; endl;
        }
        else
        {
            running = false;
        }
    }
}

vector&lt;string&gt; getFileContent(string fileName)
{
    string curWord;
    vector&lt;string&gt; words;
    ifstream file (fileName.c_str());

    while (file.good())
    {
        file &gt;&gt; curWord;
        words.push_back(curWord);
    }
    file.close();

    return words;
}

string lower(string oldWorld)
{
    string transformed = oldWorld;
    transform (transformed.begin(),transformed.end(), transformed.begin(), (int(*)(int)) tolower);

    return transformed;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/272983/tipps-zu-meinem-c-code</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 11:36:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272983.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 Aug 2010 06:59:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 06:59:31 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>und zwar sollte ich für eine Firma einen Test mitmachen. Die Reaktion war, dass mein Code reicht für nen Praktikum aber für ne feste Stelle würde es nicht reichen. Mir wurde auch das Buch &quot;Effective C++ Third Edition van Scott Meyers&quot; empfohlen. Nur was jetzt genau nicht gut war, habe ich nicht erfahren. Somit dacht ich mir, vllt könnt ihr mir helfen und sagen, wie es anders besser wäre <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="😃"
    /><br />
Aufgabe war es eine Textdatei (config datei) einzulesen, worin verschiedene andere Textdateien stehen, diese müssen dann eingelesen werden. Und der user gibt an welches Wort er sucht. Das Programm soll dann ausgeben wie oft das Wort in welcher Datei (case(in)sensitive) vorkommt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;list&gt;
#include &lt;map&gt;
#include &lt;algorithm&gt;
#include &lt;sstream&gt;

using namespace std;

map&lt;string, vector&lt;string&gt; &gt; textFiles; // map with filenames and textfile content

vector&lt;string&gt; getFileContent(string fileName);  // returns content of file with given name
void searchForWords();  // ask user for string to be counted
string lower(string old);   // changes string to lower case

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        cerr &lt;&lt; &quot;usage: &quot; &lt;&lt; argv[0] &lt;&lt; &quot; config-Filename&quot; &lt;&lt; endl;
        exit(1);
    }

    string fileName = argv[1];          // get name of config file
    ifstream file (fileName.c_str());   // file to read

    if (file)
    {
        while (!file.eof())
        {
            string buffer;
            getline(file, buffer);
            textFiles[buffer] = getFileContent(buffer); // get vector with file content and store it in map
        }

        file.close();
        searchForWords();
    }
    else
    {
        cerr &lt;&lt; &quot;cannot open file &quot; &lt;&lt; fileName &lt;&lt; endl;
        exit(1);
    }

    return 0;
}

void searchForWords()
{
    bool running = true;
    while (running)
    {
        cout &lt;&lt; &quot;Specify a string to be counted (q = quit):&quot;;
        string input;
        cin &gt;&gt; input;

        if (input != &quot;q&quot; )
        {
            int counterSensitive = 0;
            int counterInsensitive = 0;
            string fileStringSen;
            string fileStringInsen;
            for (map&lt;string, vector&lt;string&gt; &gt;::const_iterator i = textFiles.begin(); i != textFiles.end(); ++i)
            {
                vector&lt;string&gt; words = i-&gt;second;
                string curTextFile = i-&gt;first;
                int fileCounterSen = 0;
                int fileCounterInsen = 0;
                for (vector&lt;string&gt;::const_iterator j = words.begin(); j != words.end(); ++j)
                {
                    if (*j  == input)
                    {
                        counterSensitive++;
                        fileCounterSen++;
                    }
                    if (lower(*j) == lower(input))
                    {
                        counterInsensitive++;
                        fileCounterInsen++;
                    }
                }
                if (fileCounterSen &gt; 0)
                {
                    stringstream ss; //create a stringstream
                    ss &lt;&lt; curTextFile &lt;&lt; &quot;: &quot; &lt;&lt; fileCounterSen &lt;&lt; endl;
                    fileStringSen += ss.str();
                }
                if (fileCounterInsen &gt; 0)
                {
                    stringstream ss; //create a stringstream
                    ss &lt;&lt; curTextFile &lt;&lt; &quot;: &quot; &lt;&lt; fileCounterInsen &lt;&lt; endl;
                    fileStringInsen += ss.str();
                }
            }

            cout &lt;&lt; &quot;-- Case sensitive --&quot; &lt;&lt; endl;
            cout &lt;&lt; &quot;Overall: &quot; &lt;&lt; counterSensitive&lt;&lt; endl;
            cout &lt;&lt; fileStringSen;

            cout &lt;&lt; &quot;-- Case insensitive --&quot; &lt;&lt; endl;
            cout &lt;&lt; &quot;Overall: &quot; &lt;&lt; counterInsensitive &lt;&lt; endl;
            cout &lt;&lt; fileStringInsen;
            cout &lt;&lt; endl;
        }
        else
        {
            running = false;
        }
    }
}

vector&lt;string&gt; getFileContent(string fileName)
{
    string curWord;
    vector&lt;string&gt; words;
    ifstream file (fileName.c_str());

    while (file.good())
    {
        file &gt;&gt; curWord;
        words.push_back(curWord);
    }
    file.close();

    return words;
}

string lower(string oldWorld)
{
    string transformed = oldWorld;
    transform (transformed.begin(),transformed.end(), transformed.begin(), (int(*)(int)) tolower);

    return transformed;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1945551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945551</guid><dc:creator><![CDATA[MiMi85]]></dc:creator><pubDate>Sun, 29 Aug 2010 06:59:31 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 08:03:43 GMT]]></title><description><![CDATA[<p>Ein unnötiger globaler Zustand (textFiles) ist unschön.</p>
<p>Du hast ein paar unnötige Kopien (Zeile 67 kopiert den kompletten Vektor, Zeile 68 kopiert den string). In Zeile 34 wird auch der Vektor kopiert. Das bekommt man weg, in dem man Referenzen-auf-const verwendet oder im letzten Fall</p>
<pre><code class="language-cpp">getFileContent(buffer) .swap( textFiles[buffer] );
</code></pre>
<p>schreibt. Bei sehr großen Dateien, könnte das einen Unterschied machen.</p>
<p>Die searchForWords Funktion ist ein bissel lang und speziell.</p>
<p>So, wie das Programm aufgebaut ist, speicherst Du alle Wörter aller Dateien. Wenn das so in der Aufgabenstellung drin stand, ok, aber eigentlich ist das gar nicht notwendig. Man könnte den Benutzer vorher fragen, welches Wort gesucht wird und dann einfach alle Dateien der Reihe nach einlesen, zB so:</p>
<pre><code class="language-cpp">long word_frequency_in_file(char const* filename, string const&amp; word);

...

for (int fileindex=0; fileindex&lt;...; ++fileindex) {
  char const* pfilename = ...;
  long freq = word_frequency_in_file(pfilename,word);
  cout &lt;&lt; pfilename &lt;&lt; &quot; --&gt; &quot; &lt;&lt; freq &lt;&lt; &quot; occurences.&quot; &lt;&lt; endl;
}
</code></pre>
<p>Sonst, gibt's eigentlich nicht zu meckern.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945557</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 29 Aug 2010 08:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 08:15:40 GMT]]></title><description><![CDATA[<p>Also ich habe schon deutlich schlechteren Code von C++ Programmierern gesehen.<br />
Ich finde, du hast die Aufgabe gut erfüllt.<br />
Ich nehme an, die Firma wollte sehen, daß du hier eine Klasse definierst (auch wenn dies für die Aufgabe hier m.E. völlig irrelevant ist),</p>
<p>Dennoch könnte man noch ein paar Kleinigkeiten anmerken:<br />
- Aufteilung in Input/Output und Logik (d.h. die for-Schleife für die 'map' in eine eigene Methode auslagern)<br />
- Für die Wiederverwendbarkeit des Algorithmus die Funktionen in eine eigene Source- und Header-Datei auslagern</p>
<p>Viel Erfolg noch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945560</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sun, 29 Aug 2010 08:15:40 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 08:18:29 GMT]]></title><description><![CDATA[<p>Ich nehme auch an, dass Dinge wie</p>
<pre><code class="language-cpp">string fileName = argv[1];          // get name of config file
    ifstream file (fileName.c_str());   // file to read
</code></pre>
<p>keinen guten Eindruck gemacht haben, zumal fileName nirgends benötigt wird.</p>
<p>Außerdem machst du beim Einlesen der Dateien einen Anfängerfehler - statt</p>
<pre><code class="language-cpp">while (!file.eof())
        {
            string buffer;
            getline(file, buffer);
            textFiles[buffer] = getFileContent(buffer);
        }
</code></pre>
<p>muss das</p>
<pre><code class="language-cpp">string buffer;
while(getline(file, buffer)) {
  textFiles[buffer] = getFileContent(buffer);
}
</code></pre>
<p>heißen, sonst verarbeitest du die letzte Zeile doppelt. In gleicher Weise muss</p>
<pre><code class="language-cpp">while (file.good())
    {
        file &gt;&gt; curWord;
        words.push_back(curWord);
    }
</code></pre>
<p>richtig</p>
<pre><code class="language-cpp">while(file &gt;&gt; curWord) {
  words.push_back(curWord);
}
</code></pre>
<p>sein, sonst zählst du das letzte Wort doppelt.</p>
<p>Was den Algorithmus selbst angeht, wenn du schon eine Datenbank anlegst (was mich vermuten lässt, dass diese nachher oft benutzt werden soll), ist es womöglich effizienter, die Worte gleich beim Einlesen zu zählen und nachher nur noch das Ergebnis nachzuschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945561</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 29 Aug 2010 08:18:29 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 08:42:03 GMT]]></title><description><![CDATA[<p>Was für eine Ausbildung hst du und wieviel zeit hast du gehabt?</p>
<p>Variablen in for-scheifen müssen nicht i und j heißen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945571</guid><dc:creator><![CDATA[zzet]]></dc:creator><pubDate>Sun, 29 Aug 2010 08:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 08:52:15 GMT]]></title><description><![CDATA[<p>Nachtrag: Ich denke dabei an etwas in dieser Art:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;locale&gt;
#include &lt;map&gt;
#include &lt;string&gt;

#include &lt;tr1/functional&gt;

struct string_compare_ci {
public:
  string_compare_ci(std::locale const &amp;loc = std::locale())
    : loc_(loc),
      compare_(std::tr1::bind(char_compare,
                              std::tr1::placeholders::_1,
                              std::tr1::placeholders::_2,
                              loc_)) { }

  static bool char_compare(char c1, char c2, std::locale const &amp;loc) {
    return std::tolower(c1, loc) &lt; std::tolower(c2, loc);
  }

  bool operator()(std::string const &amp;lhs,
                  std::string const &amp;rhs) const {
    return std::lexicographical_compare(lhs.begin(), lhs.end(),
                                        rhs.begin(), rhs.end(),
                                        compare_);
  }

private:
  std::locale loc_;
  std::tr1::function&lt;bool(char, char)&gt; compare_;
};

typedef std::map&lt;std::string, unsigned&gt;                    word_map_t;
typedef std::map&lt;std::string, unsigned, string_compare_ci&gt; word_map_ci_t;
typedef std::pair&lt;word_map_t, word_map_ci_t&gt; word_maps_t;

typedef std::map&lt;std::string, word_maps_t&gt; database_t;

word_maps_t count_words(std::string const &amp;filename) {
  word_maps_t result;
  std::ifstream in(filename.c_str());
  std::string word;

  while(in &gt;&gt; word) {
    ++result.first [word];
    ++result.second[word];
  }

  return result;
}

template&lt;typename map_t&gt;
unsigned word_lookup(map_t const &amp;map, std::string const &amp;word) {
  typename map_t::const_iterator iter = map.find(word);

  return iter == map.end() ? 0 : iter-&gt;second;
}

int main(int argc, char *argv[]) {
  if(argc != 2) { return -1; }

  std::ifstream in(argv[1]);

  if(!in) { return -1; }

  database_t database;
  std::string fname;

  while(std::getline(in, fname)) {
    database[fname] = count_words(fname);
  }

  std::string query;

  while(true) {
    std::getline(std::cin, query);

    if(query == &quot;&quot;) {
      break;
    }

    unsigned counter_full    = 0;
    unsigned counter_full_ci = 0;

    for(database_t::const_iterator db_iter = database.begin(); db_iter != database.end(); ++db_iter) {
      std::cout &lt;&lt; db_iter-&gt;first &lt;&lt; &quot;:\n&quot;;

      unsigned counter    = word_lookup(db_iter-&gt;second.first , query);
      unsigned counter_ci = word_lookup(db_iter-&gt;second.second, query);

      std::cout &lt;&lt; &quot;Case sensitive: &quot;   &lt;&lt; counter    &lt;&lt; &quot;\n&quot;
                   &quot;Case insensitive: &quot; &lt;&lt; counter_ci &lt;&lt; '\n';

      counter_full    += counter;
      counter_full_ci += counter_ci;
    }

    std::cout &lt;&lt; &quot;Zusammen: \n&quot;
                 &quot;Case sensitive: &quot;   &lt;&lt; counter_full    &lt;&lt; &quot;\n&quot;
                 &quot;Case insensitive: &quot; &lt;&lt; counter_full_ci &lt;&lt; std::endl;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1945573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945573</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 29 Aug 2010 08:52:15 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 09:02:38 GMT]]></title><description><![CDATA[<p>Erstmal danke, für die vielen schnellen Antworten <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>Th69 schrieb:</p>
<blockquote>
<p>Also ich habe schon deutlich schlechteren Code von C++ Programmierern gesehen.<br />
Ich finde, du hast die Aufgabe gut erfüllt.</p>
</blockquote>
<p>Sowas freut einen doch zu hören ;), wo ich doch eher bei Java mich einordne ^^</p>
<p>Th69 schrieb:</p>
<blockquote>
<p>Dennoch könnte man noch ein paar Kleinigkeiten anmerken:<br />
- Aufteilung in Input/Output und Logik (d.h. die for-Schleife für die 'map' in eine eigene Methode auslagern)<br />
- Für die Wiederverwendbarkeit des Algorithmus die Funktionen in eine eigene Source- und Header-Datei auslagern</p>
</blockquote>
<p>Über eine eigene Header hatte ich nachgedacht, nur habe ich ein wenig gegoogelt, und nirgends steht ab wann man eine header nutzen sollte, nur das es meist sinnvoll ab größeren Programmen mit mehreren Tausend Zeilen wird. Daher hatte ich mich dagegen entschieden, vielleicht ein Fehler -.-</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Ich nehme auch an, dass Dinge wie</p>
<pre><code class="language-cpp">string fileName = argv[1];          // get name of config file
    ifstream file (fileName.c_str());   // file to read
</code></pre>
<p>keinen guten Eindruck gemacht haben, zumal fileName nirgends benötigt wird.</p>
</blockquote>
<p>Also lieber direkt</p>
<pre><code class="language-cpp">ifstream file (argv[1]);
</code></pre>
<p>seldon schrieb:</p>
<blockquote>
<p>Außerdem machst du beim Einlesen der Dateien einen Anfängerfehler [...]sonst verarbeitest du die letzte Zeile doppelt. [...] sonst zählst du das letzte Wort doppelt.</p>
</blockquote>
<p>Hm, dann ist seltsam, dass das Ergebnis stimmt, also die Ausgabe, wenns doppelt verarbeitet wird.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Was den Algorithmus selbst angeht, wenn du schon eine Datenbank anlegst (was mich vermuten lässt, dass diese nachher oft benutzt werden soll), ist es womöglich effizienter, die Worte gleich beim Einlesen zu zählen und nachher nur noch das Ergebnis nachzuschlagen.</p>
</blockquote>
<p>Du meinst mit &quot;Datenbank&quot; die Map? Ja, das mit dem direkt zählen wäre wohl ne Alternative gewesen. Wäre es dann angebracht gewesen, ein eigenes Objekt pro Textdatei zu erstellen, wodrin dann die Informationen wie Wort und Anzahl gespeichert werden? Oder die Map weiter ausbauen<br />
map &lt;string, map &lt;string, int&gt; &gt; (map &lt;dateiname, map &lt;wort, anzahl&gt; &gt;)</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Ein unnötiger globaler Zustand (textFiles) ist unschön.</p>
</blockquote>
<p>Wie löst man sowas dann am besten? An jede Methode die map mitzugeben, ist doch auch nicht schön oder?</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Du hast ein paar unnötige Kopien [...].</p>
</blockquote>
<p>Hm, vermutlich aus meinen Java-Kentnissen, einfach alles in ne extra Variable zu speichern, so wie es dort steht ^^ (string curTextFile = i-&gt;first;)<br />
Also Referenz auf ne const -&gt;</p>
<pre><code class="language-cpp">const string &amp;curTextFile = i-&gt;first;
</code></pre>
<p>Mit der Referenz wird dann keine Kopie erstellt, weil es nur auf das Objekt zeigt, richtig? Aber warum const, weil es sich nicht verändern soll?</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>So, wie das Programm aufgebaut ist, speicherst Du alle Wörter aller Dateien. Wenn das so in der Aufgabenstellung drin stand, ok</p>
</blockquote>
<p>Ja stand so drin, hier mal der entsprechende Teil:</p>
<blockquote>
<p>The program should load all the information it needs on start up.<br />
After start up no file access is allowed, so the program should keep the necessary information in memory.</p>
</blockquote>
<p>zzet schrieb:</p>
<blockquote>
<p>Was für eine Ausbildung hst du und wieviel zeit hast du gehabt?<br />
Variablen in for-scheifen müssen nicht i und j heißen.</p>
</blockquote>
<p>Habe Informatik studiert, hatten aber wie gesagt, hautpsächlich Java.<br />
Das mit i und j ist irgendwie schon immer so gewesen, ka ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945575</guid><dc:creator><![CDATA[MiMi85]]></dc:creator><pubDate>Sun, 29 Aug 2010 09:02:38 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 09:08:32 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Nachtrag: Ich denke dabei an etwas in dieser Art:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;locale&gt;
#include &lt;map&gt;
#include &lt;string&gt;

#include &lt;tr1/functional&gt;

struct string_compare_ci {
public:
  string_compare_ci(std::locale const &amp;loc = std::locale())
    : loc_(loc),
      compare_(std::tr1::bind(char_compare,
                              std::tr1::placeholders::_1,
                              std::tr1::placeholders::_2,
                              loc_)) { }

  static bool char_compare(char c1, char c2, std::locale const &amp;loc) {
    return std::tolower(c1, loc) &lt; std::tolower(c2, loc);
  }

  bool operator()(std::string const &amp;lhs,
                  std::string const &amp;rhs) const {
    return std::lexicographical_compare(lhs.begin(), lhs.end(),
                                        rhs.begin(), rhs.end(),
                                        compare_);
  }

private:
  std::locale loc_;
  std::tr1::function&lt;bool(char, char)&gt; compare_;
};

typedef std::map&lt;std::string, unsigned&gt;                    word_map_t;
typedef std::map&lt;std::string, unsigned, string_compare_ci&gt; word_map_ci_t;
typedef std::pair&lt;word_map_t, word_map_ci_t&gt; word_maps_t;

typedef std::map&lt;std::string, word_maps_t&gt; database_t;

word_maps_t count_words(std::string const &amp;filename) {
  word_maps_t result;
  std::ifstream in(filename.c_str());
  std::string word;

  while(in &gt;&gt; word) {
    ++result.first [word];
    ++result.second[word];
  }

  return result;
}

template&lt;typename map_t&gt;
unsigned word_lookup(map_t const &amp;map, std::string const &amp;word) {
  typename map_t::const_iterator iter = map.find(word);

  return iter == map.end() ? 0 : iter-&gt;second;
}

int main(int argc, char *argv[]) {
  if(argc != 2) { return -1; }

  std::ifstream in(argv[1]);

  if(!in) { return -1; }

  database_t database;
  std::string fname;

  while(std::getline(in, fname)) {
    database[fname] = count_words(fname);
  }

  std::string query;
    
  while(true) {
    std::getline(std::cin, query);

    if(query == &quot;&quot;) {
      break;
    }

    unsigned counter_full    = 0;
    unsigned counter_full_ci = 0;

    for(database_t::const_iterator db_iter = database.begin(); db_iter != database.end(); ++db_iter) {
      std::cout &lt;&lt; db_iter-&gt;first &lt;&lt; &quot;:\n&quot;;

      unsigned counter    = word_lookup(db_iter-&gt;second.first , query);
      unsigned counter_ci = word_lookup(db_iter-&gt;second.second, query);

      std::cout &lt;&lt; &quot;Case sensitive: &quot;   &lt;&lt; counter    &lt;&lt; &quot;\n&quot;
                   &quot;Case insensitive: &quot; &lt;&lt; counter_ci &lt;&lt; '\n';

      counter_full    += counter;
      counter_full_ci += counter_ci;
    }

    std::cout &lt;&lt; &quot;Zusammen: \n&quot;
                 &quot;Case sensitive: &quot;   &lt;&lt; counter_full    &lt;&lt; &quot;\n&quot;
                 &quot;Case insensitive: &quot; &lt;&lt; counter_full_ci &lt;&lt; std::endl;
  }
}
</code></pre>
</blockquote>
<p>Dein Level: The Abstraction Freak<br />
<a href="http://coderoom.wordpress.com/2010/03/19/5-stages-of-programmer-incompetence/" rel="nofollow">http://coderoom.wordpress.com/2010/03/19/5-stages-of-programmer-incompetence/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945576</guid><dc:creator><![CDATA[eeeeeeeke]]></dc:creator><pubDate>Sun, 29 Aug 2010 09:08:32 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 09:22:24 GMT]]></title><description><![CDATA[<p>Achja, Zeitvorgabe gabs keine.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Nachtrag: Ich denke dabei an etwas in dieser Art:</p>
</blockquote>
<p>Leider bin ich davon, vom Verständnis und dem Programmieren selbst, wohl noch meilenweit entfernt.</p>
<p>Wir haben halt 2 Jahre Java gemacht und dann ca nen halbes Jahr C++ dran gehängt (Unterricht) und nochmal nen halbes Jahr mit nem eigenen Projekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945582</guid><dc:creator><![CDATA[MiMi85]]></dc:creator><pubDate>Sun, 29 Aug 2010 09:22:24 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 09:54:13 GMT]]></title><description><![CDATA[<p>@eeeeeeeke:</p>
<p>Ich bin der Ansicht, dass ein &quot;Abstraction Freak&quot; sich mindestens noch eine Akkumulatorvorlage für die Abfrage geschrieben hätte, der die Zwischenergebnisse in einen eigens für die Formatierung bestimmten Datentyp (d.h. mit entsprechendem operator&lt;&lt; versehenen) verpackt und in einen ostream_iterator geschmissen hätte.</p>
<p>Aber mal in Ernst, wo ist da die große Abstraktion? Eine std::map mit einem eigenen Vergleichsfunktor zu versehen, ist nun wirklich kein besonders komplexer Anwendungsfall, und ansonsten habe ich da gerade mal eine Funktion und eine Funktionsvorlage. Viel einfacher wird das ganze eigentlich nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945600</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 29 Aug 2010 09:54:13 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 09:55:10 GMT]]></title><description><![CDATA[<p>MiMi85 schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Ein unnötiger globaler Zustand (textFiles) ist unschön.</p>
</blockquote>
<p>Wie löst man sowas dann am besten? An jede Methode die map mitzugeben, ist doch auch nicht schön oder?</p>
</blockquote>
<p>Doch, das ist schon besser. Noch besser sind kleinere Funktionen, die nicht 100 Parameter bekommen. ZB:</p>
<pre><code class="language-cpp">long count_word_frequency(vector&lt;string&gt; const&amp; words, string const&amp; word);
</code></pre>
<p>MiMi85 schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Du hast ein paar unnötige Kopien [...].</p>
</blockquote>
<p>Hm, vermutlich aus meinen Java-Kentnissen, einfach alles in ne extra Variable zu speichern, so wie es dort steht ^^ (string curTextFile = i-&gt;first;)<br />
Also Referenz auf ne const -&gt;</p>
<pre><code class="language-cpp">const string &amp;curTextFile = i-&gt;first;
</code></pre>
<p>Mit der Referenz wird dann keine Kopie erstellt, weil es nur auf das Objekt zeigt, richtig?</p>
</blockquote>
<p>Wenn Du schon so fragen musst, ist doch eigentlich klar, dass Du noch nicht wirklich fit in C++ bist. Also: Erstmal die Sprache richtig lernen. Dann das Buch &quot;Effective C++&quot; (3rd edition) lesen.</p>
<blockquote>
<p>Aber warum const, weil es sich nicht verändern soll?</p>
</blockquote>
<p>Ja, warum nicht? &quot;Const correctness&quot; ist was feines.</p>
<blockquote>
<p>Habe Informatik studiert, hatten aber wie gesagt, hautpsächlich Java.</p>
</blockquote>
<p>Ging mir auch so. Fand ich im Nachhinein sehr schade. Ich habe mir nach dem Studium C++ selbst beigebracht. Du kannst Die Praktikumsstelle ja annehnen, und dabei C++ lernen. Vielleicht wird das danach doch was mit der Anstellung. Ich würde mir dann aber an Deiner Stelle wirklich 2-3 C++ Bücher besorgen.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945601</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 29 Aug 2010 09:55:10 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 11:28:31 GMT]]></title><description><![CDATA[<p>Naja eine Praktiktumsstelle war leider nicht verfügbar. Es kam halt nur der Kommentar, dass es so wie es jetzt ist, maximal für eine Praktikumsstelle reichen würde.</p>
<p>Ich hab mich schon öfters umgesehen, nach Tutorials die spezielle für Java-Programmierer sind, zur Umstellung auf C++. Aber selbst dort wird nicht beschrieben, wann zb Pointer gentutz werden (sollten). Oder wann header files. Finde ich sehr schade.<br />
Schaut man sich sonst nach C++ Tutorials um, fangen diese meist ganz am Anfang an, mit &quot;was sind variablen&quot; etc. Das demotivert doch sehr schnell, weil man sich leicht verkaggert vorkommt ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945638</guid><dc:creator><![CDATA[MiMi85]]></dc:creator><pubDate>Sun, 29 Aug 2010 11:28:31 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 12:00:03 GMT]]></title><description><![CDATA[<p>Wie gesagt, ich war in der gleichen Lage. Vergiss Tutorials. Ich hatte <a href="http://www.amazon.com/C-Programming-Language-Special/dp/0201700735" rel="nofollow">TC++PL</a> und <a href="http://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876" rel="nofollow">EffC++</a> relativ fix durchgelesen. Es gingen dabei viele Lichter auf, fielen viele Groschen, etc. IMHO ideal für Umsteiger. Wenn's Dir also darum geht, viel komprimierte <em>gute</em> Information in kurzer Zeit aufzunehmen, bist Du mit den zwei Büchern gut beraten. Alles andere kommt dann mit der Zeit.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945655</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 29 Aug 2010 12:00:03 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 12:41:24 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>@eeeeeeeke:</p>
<p>Ich bin der Ansicht, dass ein &quot;Abstraction Freak&quot; sich mindestens noch eine Akkumulatorvorlage für die Abfrage geschrieben hätte, der die Zwischenergebnisse in einen eigens für die Formatierung bestimmten Datentyp (d.h. mit entsprechendem operator&lt;&lt; versehenen) verpackt und in einen ostream_iterator geschmissen hätte.</p>
<p>Aber mal in Ernst, wo ist da die große Abstraktion? Eine std::map mit einem eigenen Vergleichsfunktor zu versehen, ist nun wirklich kein besonders komplexer Anwendungsfall, und ansonsten habe ich da gerade mal eine Funktion und eine Funktionsvorlage. Viel einfacher wird das ganze eigentlich nicht mehr.</p>
</blockquote>
<p>Naja, wenn man für so eine Aufgabe bind und function auspackt, sieht mir das schon nach etwas zuviel abstrahiert aus. Und dieser std::locale sieht auch stark danach aus, das ganze irgendwie international zu halten, aber std::string verhindert das wieder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945672</guid><dc:creator><![CDATA[eeeeeeeke]]></dc:creator><pubDate>Sun, 29 Aug 2010 12:41:24 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 13:08:37 GMT]]></title><description><![CDATA[<p>eeeeeeeke schrieb:</p>
<blockquote>
<p>Naja, wenn man für so eine Aufgabe bind und function auspackt, sieht mir das schon nach etwas zuviel abstrahiert aus.</p>
</blockquote>
<p>Aber der Rest des Codes mit den maps sieht doch sehr kompakt und funktional aus. Finde ich gut so.</p>
<p>Der große struct am Anfang, nur zum Stringvergleich, sieht schon etwas heftig aus. Den würde ich mindestens auf die Hälfte eindampfen</p>
<pre><code class="language-cpp">struct string_compare_ci 
{
private:
  std::locale m_loc;
public:
  string_compare_ci(std::locale const &amp;loc = std::locale()) : m_loc(loc) { }

  bool operator()(const std::string &amp;lhs,
                  const std::string &amp;rhs) const 
  {
      return std::lexicographical_compare(lhs.begin(), lhs.end(),
                                          rhs.begin(), rhs.end(),
                                          [this] (char c1, char c2 ) 
                                          { return std::tolower(c1, m_loc) &lt; std::tolower(c2, m_loc); } );
  }
};
</code></pre>
<p>wenn der Compiler sowas schon kann. (Oder sogar versuchen das ganze Ding durch Lambdas zu ersetzen, dann wäre es fast so elegant wie in C#.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945691</guid><dc:creator><![CDATA[nn]]></dc:creator><pubDate>Sun, 29 Aug 2010 13:08:37 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 13:14:56 GMT]]></title><description><![CDATA[<p>Das ist ein ziemlich merkwürdiges Verständnis von &quot;Abstraktion&quot; - ich benutze ja nur schon vorhandenen Kram. Natürlich hätte ich mir einen eigenen Funktor, der die Locale an die Funktion bindet, schreiben oder std::lexicographical_compare reimplementieren können, aber was hätte das gebracht, von Mehrarbeit abgesehen? Hätte ich string_compare_ci jetzt als Klassenvorlage aufgezogen, die einen Funktortyp zum Vergleichen der normalisierten Zeichen und eine Strategie zur Normalisierung der Zeichen erlaubt hätte, hätte ich die Kritik ja verstanden, aber so, wie's da steht, macht das Zeug schlicht das, was es muss.</p>
<p>Die Locale ist übrigens für die korrekte Behandlung von Umlauten und anderen Sonderzeichen von Bedeutung. Wenn &quot;nämlich&quot; einmal am Satzanfang und einmal in der Satzmitte steht, bist du ohne ziemlich aufgeschmissen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/27198">@nn</a>: Von der Verwendung von Lambda-Ausdrücken habe ich abgesehen, weil der neue Standard noch nicht verabschiedet und dementsprechend nicht von allen gängigen Compilern unterstützt wird. In Produktionscode hätte ich mich aber wohl bei Boost bedient, die haben etwas derartiges schon in der algorithms-Bibliothek.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945695</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 29 Aug 2010 13:14:56 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 13:49:13 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>aber so, wie's da steht, macht das Zeug schlicht das, was es muss.</p>
</blockquote>
<p>Ich stimme dir da zu. Gleichzeitig muss ich aber anerkennen, dass solcher Code geeignet ist unsichere Einsteiger in die Flucht zu schlagen.</p>
<p>Aber das ist halt der, etwas kryptische, Charme von C++. Ich kann dem Threadersteller auch nur raten, die genannten Bücher durchzuarbeiten. Dann wird ihm vieles klarer werden.</p>
<p>Und was die Lambdas, functional und bind angeht, vieleicht auch ein Buchtipp. Ich lese gerade &quot;Real world functional programming&quot;, ist eigentlich ein Buch über C# und F#, aber danach sieht man manche der neuen Sachen in C++ auch aus einer ganz anderen Perspektive.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945717</guid><dc:creator><![CDATA[nn]]></dc:creator><pubDate>Sun, 29 Aug 2010 13:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Sun, 29 Aug 2010 19:03:15 GMT]]></title><description><![CDATA[<p>nn schrieb:</p>
<blockquote>
<p>Ich stimme dir da zu. Gleichzeitig muss ich aber anerkennen, dass solcher Code geeignet ist unsichere Einsteiger in die Flucht zu schlagen.</p>
</blockquote>
<p>Da mag was dran sein, aber es hat auch etwas Gefährliches, Anfängern nur Anfänger-C++ zu zeigen. Es ist, und ich bitte, in den Vergleich jetzt nicht zu viel reinzudeuten, ein bisschen wie mit Kindern und Babysprache - sie lernen mehr, wenn man normal zu ihnen spricht.</p>
<p>Es mag durchaus sein, dass ein Anfänger das bind-Konstrukt nicht auf Anhieb durchschaut, aber auf Nachfrage erkläre ich gerne, was das alles bedeutet. Ein Anfänger wird (und muss) nicht alles wissen, aber ich halte es für respektlos, gleich davon auszugehen, dass er es nicht <em>verstehen</em> wird. Ein genaues Verständnis der dahinterliegenden Mechanismen braucht womöglich etwas Erfahrung und weitergehende Kenntnisse, aber mal ganz ehrlich, bevor jemand bis zum Kapitel &quot;Operatorüberladung&quot; gekommen ist, kann er den Mechanismus hinter</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;Hallo, Welt!&quot; &lt;&lt; std::endl;
</code></pre>
<p>auch nicht genau verstehen, und die Anwendung von std::tr1::bind und std::tr1::function ist so schwierig eigentlich nicht. Außerdem eröffnen diese Konstrukte einen ganz neuen Blickwinkel auf die Sprache, und es kann nicht schaden, angehende Programmierer damit früh in Berührung zu bringen.</p>
<p>Naja, das ist jedenfalls meine Rechtfertigung. Man kann da wohl geteilter Meinung sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945840</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 29 Aug 2010 19:03:15 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Mon, 30 Aug 2010 06:41:51 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Da mag was dran sein, aber es hat auch etwas Gefährliches, Anfängern nur Anfänger-C++ zu zeigen. Es ist, und ich bitte, in den Vergleich jetzt nicht zu viel reinzudeuten, ein bisschen wie mit Kindern und Babysprache - sie lernen mehr, wenn man normal zu ihnen spricht.</p>
</blockquote>
<p>Ja das ist auch richtig. Auch sind Programmierer, die von einer anderen Sprache kommen, sicher auch keine Babies.</p>
<p>Aber wenn man sieht, dass der halbe Quelltext in diesem Beispiel eigentlich nur dazu dient etwas zu machen, das woanders z.B. so aussieht</p>
<pre><code>var word_map_ci = new Dictionary&lt;string, string&gt;(StringComparer.CurrentCultureIgnoreCase);
</code></pre>
<p>dann bestätigt das doch gewisse Vorurteile über C++. Gut, eigentlich haben wir hier ein Problem des Bibliotheksdesigns, die STL ist mächtig, aber manchmal können kleine Aufgaben komplexen Code erfordern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1945980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1945980</guid><dc:creator><![CDATA[nn]]></dc:creator><pubDate>Mon, 30 Aug 2010 06:41:51 GMT</pubDate></item><item><title><![CDATA[Reply to Tipps zu meinem C++ code on Tue, 31 Aug 2010 08:49:33 GMT]]></title><description><![CDATA[<p>[quote=&quot;nn&quot;]</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Aber wenn man sieht, dass der halbe Quelltext in diesem Beispiel eigentlich nur dazu dient etwas zu machen, das woanders z.B. so aussieht</p>
<pre><code>var word_map_ci = new Dictionary&lt;string, string&gt;(StringComparer.CurrentCultureIgnoreCase);
</code></pre>
<p>dann bestätigt das doch gewisse Vorurteile über C++. Gut, eigentlich haben wir hier ein Problem des Bibliotheksdesigns, die STL ist mächtig, aber manchmal können kleine Aufgaben komplexen Code erfordern.</p>
</blockquote>
<p>Und das ist das Problem mit Leuten, die nicht genug von C++ verstehen und meinen sich dann drüber beschweren zu müssen. Wäre es anders, wüsstest du das es Quatsch es was du sagst. In C++ kann man das gleiche in einer Zeile machen.<br />
Ich sage nur:</p>
<pre><code class="language-cpp">//StringComparer könne genau wie in C# irgendwo in einer Lib definiert sein
std::map&lt;string,string,StringComparer::CurrenCultureIgnoreCase&gt; word_map_ci;
</code></pre>
<p>Seldons Beispiel macht deutlich mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1946429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1946429</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Tue, 31 Aug 2010 08:49:33 GMT</pubDate></item></channel></rss>