einen bestimmten string in einem iterator finden?



  • moin, ich würd gern mal wissen ob mir jemand hier weiterhelfen kann:

    das problem ist wohl, dass ich einen iterator in einen string wandeln muss das suchen in diesem strinf wird das leicheter sein 😉 hier mal mein ansatz:

    #include <iostream>
    #include <stdlib.h>
    #include <vector>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int main()
    {
        vector<int> vek;
        //vektor<string> str;
        string s;
        ostringstream os;
    
        for(int x=1;x<=100;x++)
           vek.push_back(x);
    
        for(vector<int>::iterator i=vek.begin();i != vek.end();i++)
        {
        os << *i; 
        s = os.str();
        //soll alle zahlen nur ausgeben die durch 3 teilbar sind und eine 3 enthalten
        if(*i%3 == 0 || s.find("3",0))
        cout<<*i<<endl;
        }
    
    }
    


  • das problem ist wohl, dass ich einen iterator in einen string wandeln muss das suchen in diesem strinf wird das leicheter sein 😉 hier mal mein ansatz:

    Geht's auch auf Deutsch?



  • Kóyaánasqatsi schrieb:

    das problem ist wohl, dass ich einen iterator in einen string wandeln muss das suchen in diesem strinf wird das leicheter sein 😉 hier mal mein ansatz:

    Geht's auch auf Deutsch?

    Das dachte ich mir eben auch..
    Ich frage mich, warum Leute, die Hilfe wollen es nicht schaffen in verständlichem Deutsch zu schreiben.. 🙄



  • ich möchte den Iterator *i in einen string konvertieren, um später mit einem string s arbeiten zu können..

    deutsch genug? :p



  • Geht doch. Obwohl ich annehme, dass du nicht den Iterator in einen string umwandeln möchtest, sondern dessen Inhalt. 😉

    Dann wäre es auch hilfreich, wenn du beschreibst, wo genau dein Problem liegt. Dein Ansatz sieht nämlich nicht schlecht aus..

    Probiers mal so:

    int main()
    {
        vector<int> vek;
        //vektor<string> str;
        string s;
        stringstream ss;
    
        for(int x=1;x<=100;x++)
           vek.push_back(x);
    
        for(vector<int>::iterator i=vek.begin();i != vek.end();i++)
        {
        ss << *i;
        ss >> s;
        //soll alle zahlen nur ausgeben die durch 3 teilbar sind und eine 3 enthalten
        if(*i%3 == 0 || s.find("3",0))
        cout<<*i<<endl;
        }
    
    }
    


  • drakon schrieb:

    Geht doch. Obwohl ich annehme, dass du nicht den Iterator in einen string umwandeln möchtest, sondern dessen Inhalt. 😉

    Dann wäre es auch hilfreich, wenn du beschreibst, wo genau dein Problem liegt. Dein Ansatz sieht nämlich nicht schlecht aus..

    Probiers mal so:

    int main()
    {
        vector<int> vek;
        //vektor<string> str;
        string s;
        stringstream ss;
       
        for(int x=1;x<=100;x++)
           vek.push_back(x);
       
        for(vector<int>::iterator i=vek.begin();i != vek.end();i++)
        {
        ss << *i;
        ss >> s;
        //soll alle zahlen nur ausgeben die durch 3 teilbar sind und eine 3 enthalten
        if(*i%3 == 0 || s.find("3",0))
        cout<<*i<<endl;
        }
       
    }
    

    ok danke schonma... habs ma ausprbiert.. leider hat nun s konstant den wert 1 in der schleife und es werden 100 einsen ausgegeben 😕



  • formulier doch ma pls in paar mehr sätzen, was du wirklich vor hast...

    mit mir sinds schon 3, die nicht verstehen, was du meintest ^^

    mach vll einfach ma nen bsp...

    bb



  • So solltest du (glaube ich zumindest) das Ergebnis erhalten, dass du haben möchtest. Ich habe alle kleinen Änderungen an deinem Code mit Kommentaren versehen:

    #include <iostream>
    #include <vector>
    #include <string>
    #include <sstream>
    
    int main() 
    { 
    	std::vector<int> vek; 
    	std::string s; 
    	std::stringstream ss; 
    
        for(int x = 1; x <= 100; x++) 
           vek.push_back(x); 
    
    	for(std::vector<int>::iterator i = vek.begin(); i != vek.end(); i++) 
        { 
    		ss << *i; 
    		s = ss.str(); 
    		// UND Verknüpfung und prüfen ob find() eine Übereinstimmung im String fand
    		// (bei keiner Übereinstimmung gibt er den Wert "npos" zurück, ein Wert
    		// der größer als jeder gültige Index des Strings ist)
    		if(*i % 3 == 0 && s.find("3") != s.npos) 
    			std::cout << *i << std::endl;
    		// Dem stringstream einen leeren String übergeben, um so den Stream
    		// selbst zu "leeren"
    		ss.str("");
        } 
    
    	return 0;
    }
    


  • Das Problem ist der stringstream. Der ist nicht mehr frisch 😉
    Das einfachste ist ihn einfach erst in der Schleife zu erstellen:

    for(vector<int>::iterator i=vek.begin();i != vek.end();i++) 
        {
            ostringstream ss; 
            int num = *i;
            ss << num; 
            string s = ss.str();
            if(num%3 == 0) 
                cout << s << endl; 
        }
    

    Ob das langsamer ist als den String zu löschen? K.A. 😉
    B.T.W warum geht das eigentlich nicht mittels ss.clear() && ss.flush()? Warum muss das ein ss.str("") sein?



  • Mit ss.clear() kann man nur die Fehlerflags des Streams ändern, nicht jedoch den Inhalt des selbigen. Zu ss.flush() kann ich dir aber leider auch nichts sagen :(.



  • Hier aus dem Netz zu flush:
    clear(), geerbt von std::ios, löscht die Fehlerflags. flush() führt alle gepufferten Output-Stream-Operationen aus. Ich denke, du suchst Temp.str("").


Anmelden zum Antworten