<?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[Multimap]]></title><description><![CDATA[<p>ich soll eine multimap mit strings füllen, die ich vorher aus einer txt datei ausgelesen habe. der text soll beim einlesen mit hilfe der methode parseString in einzelne strings konvertiert werden (also Ignorieren von Punkten,Kommata usw.) neben dem string soll die jeweilige zeilennummer, in der der string (auch mehrmals) auftritt mit abgespeichert werden. Also als Beispiel beim Text</p>
<p>Alle meine Entchen,<br />
schwimmen in dem See,<br />
schwimmen in dem See,</p>
<p>soll als Ausgabe rauskommen:</p>
<p>Alle 1<br />
Entchen 1<br />
See 2 3<br />
dem 2 3<br />
in 2 3<br />
meine 1<br />
schwimmen 2 3</p>
<p>Dieses nennt man auch Cross Reference Liste. Mein erster Ansatz sieht so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;map&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

using namespace std;

struct ltstr
{
    bool operator()(const char* s1, const char* s2) const
    {
         return strcmp(s1, s2) &lt; 0;
    }
};

void MakeXRef(ifstream fin2, multimap &lt;const char * const, ltstr &gt; m2)
{
    int tmp = 0; 
    while (!fin2.eof())
    {
          std::string s; 
          fin2 &gt;&gt; s;           
          m2.insert(pair&lt;const char * const, int&gt; (s,++tmp)); //Geht nicht
    }
}

void PrintXRef(ifstream fin3, multimap &lt;const char * const, ltstr &gt; m3, Iterator j2)
{

   //Soll die Ausgabe durchführen  

}

int main()
{
    typedef multimap &lt;const char * const, int, ltstr &gt; Mum;
    typedef Mum::iterator Iterator;
    Mum m;
    Iterator j;   
    char buffer [512];
    int line = 0;
    ifstream fin(&quot;uebung10.txt&quot;);   
    MakeXRef(fin,m);  
    PrintXRef(fin,m,j);   
    system(&quot;pause&quot;);
    return 0;    
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/130187/multimap</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 11:47:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/130187.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Dec 2005 17:00:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 17:00:50 GMT]]></title><description><![CDATA[<p>ich soll eine multimap mit strings füllen, die ich vorher aus einer txt datei ausgelesen habe. der text soll beim einlesen mit hilfe der methode parseString in einzelne strings konvertiert werden (also Ignorieren von Punkten,Kommata usw.) neben dem string soll die jeweilige zeilennummer, in der der string (auch mehrmals) auftritt mit abgespeichert werden. Also als Beispiel beim Text</p>
<p>Alle meine Entchen,<br />
schwimmen in dem See,<br />
schwimmen in dem See,</p>
<p>soll als Ausgabe rauskommen:</p>
<p>Alle 1<br />
Entchen 1<br />
See 2 3<br />
dem 2 3<br />
in 2 3<br />
meine 1<br />
schwimmen 2 3</p>
<p>Dieses nennt man auch Cross Reference Liste. Mein erster Ansatz sieht so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;map&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

using namespace std;

struct ltstr
{
    bool operator()(const char* s1, const char* s2) const
    {
         return strcmp(s1, s2) &lt; 0;
    }
};

void MakeXRef(ifstream fin2, multimap &lt;const char * const, ltstr &gt; m2)
{
    int tmp = 0; 
    while (!fin2.eof())
    {
          std::string s; 
          fin2 &gt;&gt; s;           
          m2.insert(pair&lt;const char * const, int&gt; (s,++tmp)); //Geht nicht
    }
}

void PrintXRef(ifstream fin3, multimap &lt;const char * const, ltstr &gt; m3, Iterator j2)
{

   //Soll die Ausgabe durchführen  

}

int main()
{
    typedef multimap &lt;const char * const, int, ltstr &gt; Mum;
    typedef Mum::iterator Iterator;
    Mum m;
    Iterator j;   
    char buffer [512];
    int line = 0;
    ifstream fin(&quot;uebung10.txt&quot;);   
    MakeXRef(fin,m);  
    PrintXRef(fin,m,j);   
    system(&quot;pause&quot;);
    return 0;    
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/946464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946464</guid><dc:creator><![CDATA[shurik&#x27;n]]></dc:creator><pubDate>Tue, 20 Dec 2005 17:00:50 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 17:04:23 GMT]]></title><description><![CDATA[<p>und die frage?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/946467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946467</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 20 Dec 2005 17:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 17:05:26 GMT]]></title><description><![CDATA[<p>s.c_str () sollte funktionieren, aber warum nimmst du nicht einfach generell std::string?<br />
Und solche großen Sachen wie eine Map sollten eigentlich nicht als Referenz übergeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/946469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946469</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 20 Dec 2005 17:05:26 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 17:08:25 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>und die frage?</p>
</blockquote>
<p>Sorry, dieser Teil geht nicht. Ich kann das nicht in die Map einlesen.</p>
<pre><code class="language-cpp">void MakeXRef(ifstream fin2, multimap &lt;const char * const, ltstr &gt; m2)
{
    int tmp = 0; 
    while (!fin2.eof())
    {
          std::string s; 
          fin2 &gt;&gt; s;           
          m2.insert(pair&lt;const char * const, int&gt; (s,++tmp));
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/946472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946472</guid><dc:creator><![CDATA[shurik&#x27;n]]></dc:creator><pubDate>Tue, 20 Dec 2005 17:08:25 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 17:11:55 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>s.c_str () sollte funktionieren, aber warum nimmst du nicht einfach generell std::string?<br />
Und solche großen Sachen wie eine Map sollten eigentlich nicht als Referenz übergeben werden.</p>
</blockquote>
<p>stimmt, aber danach darfst du m2 nicht mehr anfassen. denn s wird zerstört und nimmt den speicher, auf den s.c_str zeigte, gleich mit.</p>
<p>also:<br />
multimap<a href="std::string,int" rel="nofollow">std::string,int</a><br />
oder evtl bequemer ist:<br />
map&lt;std::string,std::vector&lt;int&gt; &gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/946478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946478</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 20 Dec 2005 17:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 17:39:46 GMT]]></title><description><![CDATA[<p>Ich habe das soweit umgeschrieben. Danke für Eure Hilfe. Nun habe aber noch ein Problem. Ich erhöhe die tmp Variable ja bei jedem Einlesen um 1. Die tmp Variable spiegelt ja die Zeilennummer wieder. Da heisst er soll diese nur erhöhen wenn er eine Zeile weiter geht und nicht bei jedem String.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;map&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
    typedef multimap &lt;std::string, int&gt; Mum;
    typedef Mum::iterator Iterator;
    Mum m;
    Iterator j;   
    int line = 0;
    ifstream fin(&quot;uebung10.txt&quot;);  
    int tmp = 0; 
    while (!fin.eof())
    {
          std::string s; 
          fin &gt;&gt; s;           
          m.insert(pair&lt;std::string, int&gt; (s,++tmp));
    }
    for (j = m.begin(); j != m.end(); ++j)
            cout &lt;&lt; &quot; [&quot; &lt;&lt; (*j).first &lt;&lt; &quot;, &quot; &lt;&lt; (*j).second &lt;&lt; &quot;]&quot; &lt;&lt; endl;
    system(&quot;pause&quot;);
    return 0;    
}
</code></pre>
<p>Außerdem ignoriert noch nicht das Komma und den Punkt.</p>
<p>Die Ausgabe ist bei meinem Programm.</p>
<p>[, 12]<br />
[Alle, 1]<br />
[Entchen,, 3]<br />
[See,, 7]<br />
[See., 11]<br />
[dem, 6]<br />
[dem, 10]<br />
[in, 5]<br />
[in, 9]<br />
[mein, 2]<br />
[schwimmen, 4]<br />
[schwimmen, 8]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/946491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946491</guid><dc:creator><![CDATA[shurik&#x27;n]]></dc:creator><pubDate>Tue, 20 Dec 2005 17:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 17:44:54 GMT]]></title><description><![CDATA[<p>Wie wärs damit:</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt; parse (const std::string&amp; s)
{
    std::vector&lt;std::string&gt; v;

    for (std::string::iterator j = s.begin (), i = s.begin (); i != s.end (); ++i)
    {
        if (*i == ' ' || *i == ',' || *i == '.')
        {
            if (j != i - 1)
                v.push_back (std::string (j, i);
            j = i;
        }
    }
    return v;
}

// in der Schleife:

std::string s;
getline (fin, s);
parse (s) // verarbeiten
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/946501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946501</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 20 Dec 2005 17:44:54 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 17:49:46 GMT]]></title><description><![CDATA[<p>Cool, danke für Deine Mühen. Gleichmal ausprobieren. <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/946507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946507</guid><dc:creator><![CDATA[shurik&#x27;n]]></dc:creator><pubDate>Tue, 20 Dec 2005 17:49:46 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 17:59:05 GMT]]></title><description><![CDATA[<p>Meintest Du das so? Da gibt es ein Kovertierungsfehler.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;map&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

std::vector&lt;std::string&gt; parse (const std::string&amp; s)
{
    std::vector&lt;std::string&gt; v;

    for (std::string::iterator j = s.begin (), i = s.begin (); i != s.end (); ++i)
    {
        if (*i == ' ' || *i == ',' || *i == '.')
        {
            if (j != i - 1)
                v.push_back (std::string (j, i));
            j = i;
        }
    }
    return v;
}

int main()
{
    typedef multimap &lt;std::string, int&gt; Mum;
    typedef Mum::iterator Iterator;
    Mum m;
    Iterator k;   
    int line = 0;
    ifstream fin(&quot;uebung10.txt&quot;);  
    int tmp = 0; 
    while (!fin.eof())
    {
          std::string s; 
          getline(fin,s);
          parse(s);       
          m.insert(pair&lt;std::string, int&gt; (s,++tmp));
    }
    for (k = m.begin(); k != m.end(); ++k)
            cout &lt;&lt; &quot; [&quot; &lt;&lt; (*k).first &lt;&lt; &quot;, &quot; &lt;&lt; (*k).second &lt;&lt; &quot;]&quot; &lt;&lt; endl;
    system(&quot;pause&quot;);
    return 0;    
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/946513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946513</guid><dc:creator><![CDATA[shurik&#x27;n]]></dc:creator><pubDate>Tue, 20 Dec 2005 17:59:05 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 18:04:33 GMT]]></title><description><![CDATA[<p>Statt</p>
<pre><code class="language-cpp">parse (s); m.insert //blabla
</code></pre>
<p>das hier:</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt; v = parse (s);
for (std::vector&lt;std::string&gt;::iterator i = v.begin (); i != v.end (); ++i)
    m.insert (std::make_pair (*i, tmp);
++tmp;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/946517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946517</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 20 Dec 2005 18:04:33 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 18:13:30 GMT]]></title><description><![CDATA[<p>Immer noch ein Kovertierungsfehler im stl iterator. Außerdem sagt er in der parse Methode im For Schleifen Kopf &quot;instantiated from here&quot; Kennt der Compiler überhaupt die Variable i in der parse Methode??</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;map&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

std::vector&lt;std::string&gt; parse (const std::string&amp; s)
{
    std::vector&lt;std::string&gt; v;

    for (std::string::iterator j = s.begin (), i = s.begin (); i != s.end (); ++i)
    {
        if (*i == ' ' || *i == ',' || *i == '.')
        {
            if (j != i - 1)
                v.push_back (std::string (j, i));
            j = i;
        }
    }
    return v;
}

int main()
{
    typedef multimap &lt;std::string, int&gt; Mum;
    typedef Mum::iterator Iterator;
    Mum m;
    Iterator k;   
    int line = 0;
    ifstream fin(&quot;uebung10.txt&quot;);  
    int tmp = 0; 
    while (!fin.eof())
    {
          std::string s; 
          getline(fin,s);
          std::vector&lt;std::string&gt; v = parse (s);
          for (std::vector&lt;std::string&gt;::iterator i = v.begin (); i != v.end (); ++i)
              m.insert (std::make_pair (*i, tmp));
          ++tmp;
    }
    for (k = m.begin(); k != m.end(); ++k)
            cout &lt;&lt; &quot; [&quot; &lt;&lt; (*k).first &lt;&lt; &quot;, &quot; &lt;&lt; (*k).second &lt;&lt; &quot;]&quot; &lt;&lt; endl;
    system(&quot;pause&quot;);
    return 0;    
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/946522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946522</guid><dc:creator><![CDATA[shurik&#x27;n]]></dc:creator><pubDate>Tue, 20 Dec 2005 18:13:30 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 18:38:29 GMT]]></title><description><![CDATA[<p>Deine String referenz ist const. nimm einen const_iterator;</p>
<p>Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/946532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946532</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Tue, 20 Dec 2005 18:38:29 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 18:49:56 GMT]]></title><description><![CDATA[<p>ZuK schrieb:</p>
<blockquote>
<p>Deine String referenz ist const. nimm einen const_iterator;</p>
<p>Kurt</p>
</blockquote>
<p>Mann, bist du gut. Super, danke. Jetzt geht es. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/946537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946537</guid><dc:creator><![CDATA[shurik&#x27;n]]></dc:creator><pubDate>Tue, 20 Dec 2005 18:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Tue, 20 Dec 2005 19:32:17 GMT]]></title><description><![CDATA[<p>Die parse Methode macht mir noch Kopfschmerzen. Ich verstehe hier nicht wie die Strings getrennt werden. Wenn ein Punkt, Komma oder Leerzeichen kommt dann wird gefragt ob der string ungleich des strings - 1 ist. Falls ja wird die push_back Methode aufgerufen. Und was wird hier gemacht? Andersrum wenn der string gleich des string - 1 ist wird in j i gespeichert. Ich bin verwirrt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Außerdem ist mir bei der Ausgabe der MultiMap aufgefallen, dass außer bei den ersten Wörtern der jeweiligen Zeile jeweils eine Leerzeichen am Anfang des Wortes steht. Beispiel:</p>
<p>[Alle, 1] //Sieht gut aus<br />
[ meine, 1] // ?? Was macht dieses Leerzeichen dort?</p>
<pre><code class="language-cpp">vector &lt;string&gt; parseString (string s)
              {
                  vector &lt;string&gt; v;

                  for (string::iterator j = s.begin (), i = s.begin (); i != s.end (); ++i)
                  {
                      if (*i == ' ' || *i == ',' || *i == '.')
                      {
                         if (j != i - 1)
                             v.push_back (string (j, i));
                         j = i;
                      }
                  }
                  return v;
              }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/946559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946559</guid><dc:creator><![CDATA[shurik&#x27;n]]></dc:creator><pubDate>Tue, 20 Dec 2005 19:32:17 GMT</pubDate></item><item><title><![CDATA[Reply to Multimap on Wed, 21 Dec 2005 09:14:43 GMT]]></title><description><![CDATA[<p>Habs ein wenig umbebaut</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;map&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;iomanip&gt;

using namespace std;

bool is_separator( string::const_iterator i ) {
    static string sepchars = &quot; \t,.!?&quot;;
    return sepchars.find(*i) != string::npos;
}

std::vector&lt;std::string&gt; parse (const std::string&amp; s){

    std::vector&lt;std::string&gt; ret_vect;

    for (std::string::const_iterator j = s.begin (), i = s.begin (); i != s.end (); ++i) {
        if ( is_separator( i )  ) {
            if (j != i - 1) {
	        while ( j &lt; i &amp;&amp; is_separator(j) ) 
                    ++j;
                string word = std::string (j, i);
                ret_vect.push_back ( word );
                j = i;
            }
        }
    }
    return ret_vect;
}

int main()
{
    typedef multimap &lt;std::string, int&gt; Mum;
    typedef Mum::iterator Iterator;
    Mum m;
    Iterator k;  
    int line = 0;
    ifstream fin(&quot;uebung10.txt&quot;);  
    int tmp = 0;
    while (!fin.eof()) {
        std::string s;
        getline(fin,s);
        std::vector&lt;std::string&gt; v = parse (s);
        for (std::vector&lt;std::string&gt;::iterator i = v.begin (); i != v.end (); ++i)
            m.insert (std::make_pair (*i, tmp));
        ++tmp;
    }

    string prev_word = &quot;&quot;;
    for (k = m.begin(); k != m.end(); ++k) {
        if ( (*k).first != prev_word ) {
           prev_word = (*k).first;
           cout &lt;&lt; endl &lt;&lt; setw( 20 ) &lt;&lt; prev_word &lt;&lt; &quot; found at line &quot; &lt;&lt; setw(4) &lt;&lt; (*k).second + 1;
        }
        else {
           cout &lt;&lt; &quot;, &quot; &lt;&lt; (*k).second;
        }
    }
    cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;xref done.&quot; &lt;&lt; endl;
    return 0;    
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/946833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946833</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Wed, 21 Dec 2005 09:14:43 GMT</pubDate></item></channel></rss>