Vector Container



  • Hi,
    ich will ein programm schreiben, das die eingegebenen Wörter vergleicht und zählt also zb für aa bb cc aa bb soll er aa:2 bb:2 cc:1 ausgeben. Das ganze will ich mit hilfe von vectoren anstellen.

    hier mal mein Quellcode

    #include<iostream>
    #include<string>
    #include<vector>
    
    using namespace std;
    
    struct paar
    {
    	string word;
    	int count;
    };
    
    // global variable
    vector<paar> wstat; 
    
    void add_new_entry(string inbuff)
    {
    	paar neu;
    	neu.word = inbuff;
    	wstat.push_back(neu);
    }
    
    void check_if_aviable(const string inbuff,int count)
    {
    
    	for( int i=0; i<=count;i++)
    	{
    		if(wstat[i].word == inbuff)
    			wstat[i].count++;
    		else
    			add_new_entry(inbuff);
    	}	
    }
    
    void main()
    {
    	char* inbuff=new char;
    	int count=0;
    	int count_words=0;
    	char c;
    
    	cout<<"Durch Punkt werden Wörter getrennt\nBei beenden 0 eingebn";
    	cin >> c;
    	while( c != '0')
    	{
    		inbuff[count] = c;
    
    		if(c == '.')
    		{
    			inbuff[count]= '\0';
    			count_words++;
    			check_if_aviable(inbuff,count_words);
    			count = -1;
    		}
    
    		cin >> c;
    		count++;
    
    	}
    
    	for(vector<paar>::const_iterator v = wstat.begin(); v!=wstat.end(); v++)
    	{
    
    		cout << "\n\n Wort: "<< v->word;
    		cout << "  Anzahl: " << v->count;
    	}
    
    	system("pause");
    }
    

    mit der Fkt check_if_aviable hab ich so meine Probleme, besser gesagt bekomm ich es nicht hin den Vektor komplet durchlaufen zu lassen und vergleichen ob noch ein Wort drin steht um es dann evtl hochzuzählen.
    weiß vielleicht jemand wie das geht?? bzw was ich falsch mache?

    und noch was: wie bekomme ich es denn hin, das er in der main nach Leerzeichen trennt (ich trenne mit '.') wenn ich einfach ' ' als abbruchbedingung eingebe erkennt er es nicht??!!!???

    mfG
    Phru&%&



  • Ich würde dir dafür erstens empfehlen, eine map<string,int> zum Zählen zu verwenden, dort ist es einfacher, deinen String-Wert zu finden. Wenn du unbedingt auf vector'en angewiesen bist, dann verwende lieber deren size()-Methode, um die Anzahl der Elemente zu ermitteln.

    Achja, wörter einlesen geht einfacher mit

    string str;
    cin>>str;
    

    (das packt automatisch alle Eingaben bis zum nächsten Whitespace in deinen String)



  • ich hab das mit der size- methode mal gemacht- beim ausführen bricht er aber dennoch ab und verweist auf folgende Funktion

    size_type size() const
    		{	// return length of sequence
    		return (_Mysize);
    }
    

    das ist der Gleiche Fehler wie vorher

    meine Funktion sieht nach der Änderung mit dem .size() so aus:

    void check_if_aviable(const string inbuff)
    {
    
    	for( int i=0; i<wstat.size();i++)
    	{
    
    		if(wstat[i].word == inbuff)
    			wstat[i].count++;
    		else
    			add_new_entry(inbuff);
    	}	
    }
    

    Mit dem string hab ich auch noch so ein Problem ... wie sag ich es ihm denn das er die einzelnen Wörter in den Vector einliest. Wie das schreben in den Vektor geht weiß ich ... nur hab weiß ich nicht wie ich ihm sagen soll, das er naj jedem leerzeichen die Fkt zum schreiben in den Vector aufruft

    mfG
    😕 Phruaed 😕



  • @check-Funktion: Dort hast du einen Fehler in deiner Logik - du fügst in jedem Schleifendurchlauf einen neuen Eintrag in deinen Vektor ein, wenn der Name nicht übereinstimmt. Das mußt du ein wenig umbauen:

    void check(const string& val)//Referenz statt Kopie - etwas schneller
    {
      for(int i=0;i<wstat.size();++i)
      {
        if(wstat[i].word==val)
        {
          wstat[i].count++;
          return;//Wort gefunden - beende Funktion
        }
      }
      //Wort nicht gefunden:
      add_entry(val);
    }
    

    @String-Eingabe: nach dem "cin>>str;" steht das gesamte eingelesene Wort in str - also kannst du es auch weiterverarbeiten (und an deine Funktion weiterreichen):

    cout>>"Bitte Text eingeben, Abbruch mit ENDE";
    string str;
    while( (cin>>str)&&(str!="ENDE") )
    {
      check(str);
    }
    

    PS: char* und char[] sollten in C++ eher sparsam eingesetzt werden 😉 string's sind meistens die bessere Wahl.

    PPS: und übergib deine Parameter lieber per (const) Referenz als per Kopie.



  • ooookayy danke jetzt klappt das ganze :-))

    Jetzt hätte ich noch eine klitzekleine Frage über Container, hab dazu im Netz nicht wirklich brauchbares gefunden ... was versteht man denn unter Ring-Containern??? und wie erstellt man die???

    viele Grüße
    Phruaed


Anmelden zum Antworten