iterator



  • HIer ist meine einfache Klasse:

    class Coefficients{
    	public:
    		void read(char * filename){
    			ifstream infile( filename );                                                copy(istream_iterator<double>(infile),istream_iterator<double>(),back_inserter(_values));			_size=(int)_values.size();
    }
    		...........
    	private:
    		vector<double> _values;
    		int _size;
                    ..............
    
    };
    

    Im Testprogramm werden diese Coefficients gelesen und ausgegeben.
    Danach versuche ich das gleiche über ein Iterator, aber ich bekomme nur Blödsinn

    int main(){
    	Coefficients coeff;
    	coeff.read("myCoeff.txt");
    	for(int i=0;i<=10; ++i)
    	cout<<coeff.values()[i]<<endl;// Ausgabe normal-zB 0.0141
            // das Gleiche mit Iterator
    	vector<double>::iterator  p_h;
    	p_h = coeff.values().begin();
    	for(int i=0;i<=10; ++i)
    	cout<<*p_h++ <<endl;// Ausgabe=-1.45682e+144
    }
    

    Wo ist mein Fehler??????????????



  • Versuchs mal so

    int main(){
    	Coefficients coeff;
    	coeff.read("myCoeff.txt");
    	for(int i=0;i<=10; ++i)
    	cout<<coeff.values()[i]<<endl;
             // das Gleiche mit Iterator
    	for(vector<double>::iterator p_h = coeff.values().begin();
                    p_h != coeff.values().end(); p_h++) {
    	    cout<< *p_h <<endl;
        }
    }
    


  • Ich habe es versucht aber geht nicht...Das Problemn bleibt



  • 💡 Dein Vector ist ja private 😮



  • nein es ist nicht
    ich habe diese Get-Funktionen geschrieben, aber ich wollte hier Platz sparen

    Noch einmal die ganze Klasse:

    #ifndef COEFFICIENTS_H

    #define COEFFICIENTS_H
    
    #include <vector>
    #include <string>
    #include <fstream>
    using namespace std;
    
    class Coefficients{
    	public:
    		void read(char * filename){
    			ifstream infile( filename );
    			copy(istream_iterator<double>(infile),istream_iterator<double>(),back_inserter(_values));
    			_size=(int)_values.size();
    		}
    		vector<double> values(void)const{return(_values);}
    		int size(void)const{return(_size);}
    
    	private:
    		vector<double> _values;
    		int _size;
    };
    
    #endif
    


  • Ich würde die Ausgabe als Memberfunktion machen:

    public:
    ...
        void output() {
            for(vector<double>::iterator p_h = coeff._values().begin();
                    p_h != coeff._values().end(); p_h++) {
                cout<< *p_h <<endl;
            }
        }
    ...
    

    ps: oder noch schöner den operator << überladen



  • ja so funktioniert es richtig

    ABER

    das löst mein Problem nicht wirklich.... meine Klase wird mit andere Klassen als Member der Klaase Filter. Und die Klasse Filter hat eine Funktion aplly_FIR(...) und diese Funktion arbeitet über *p_h++

    Dieses Algorithm habe ich in C getestet und ist es sehr effektiv...aber mit Pointers und jetzt möchte ich das Gleiche mit Iterators.

    War ih genug klar??



  • carmen schrieb:

    War ih genug klar??

    Nicht wirklich.. 😕

    Meinst Du so?

    vector<double>::iterator p_h = coeff._values().begin();
    while( p_h != coeff._values().end() 
    {
        cout<<*p_h++ <<endl;
    }
    


  • Ist dir klar das du hier:

    for(int i=0;i<=10; ++i)
        cout<<coeff.values()[i]<<endl;
    

    jedes mal die Funktion values() aufrufst. D.h. jedesmal ein Objekt zurückgeben lässt.
    Was natürlich nicht gerade effizient ist.

    Try this 😉

    int main(){
        Coefficients coeff;
        coeff.read("myCoeff.txt");
    
        vector<double> val = coeff.values();
    
        for(int i=0;i<=10; ++i)
               cout<<val[i]<<endl;
    
        for(vector<double>::iterator p_h = val.begin(); p_h != val.end(); ++p_h)
               cout<< *p_h <<endl;
    
    }
    


  • Eins versteh ich noch nicht.
    Willst Du immer genau 10 Werte ausgeben, oder bis ans Ende des Vectors?
    Du solltest beim Iterator auf jedenfall immer prüfen, ob Du nicht schon am Ende des Vectors angekommen bist.



  • Deine Get Methode ist fehlerhaft 😉
    Versuch mal so:

    const vector<double> &values() const
    {
       return _values;
    }
    


  • ssm schrieb:

    Deine Get Methode ist fehlerhaft 😉

    Wieso ???

    Sie kopiert das Objekt und du gibst eine Konstante Referenz darauf zurück ...



  • @ssm 👍 🙂
    und es funktioniert

    DANKE!

    Kannst du bitte mir erklären, warum kam zur richtigen Ausgabe mit cout<<coeff.values()[i] und fehlerhaft mit cout<<*p_h

    DANKEDANKEDANKE



  • Freak_Coder schrieb:

    ssm schrieb:

    Deine Get Methode ist fehlerhaft 😉

    Wieso ???

    Sie kopiert das Objekt und du gibst eine Konstante Referenz darauf zurück ...

    Das kopieren ist aber nicht "schön".



  • Freak_Coder schrieb:

    Wieso ??? Sie kopiert das Objekt und du gibst eine Konstante Referenz darauf zurück ...

    Weil carmen wollte, dass das richtig funktioniert:

    for(vector<double>::iterator p_h = coeff.values().begin(); 
                    p_h != coeff.values().end(); p_h++) 
    { 
       cout  << *p_h << endl; 
    }
    

    oder?



  • @ ssm Ja es funktioniert und meine algorithmen werden auch in der Klasse Filter mit iteratoren funktionieren, aber ich möchte verstehen warum???? sonst werde ich den Fehler wiederholen

    DANKE ssm





  • dafür habe ich keine Zeit 😉



  • Weil in der alten Version coeff.values() eine Kopie ist. Davon (von der Kopie!) holst Du Dir den begin() Iterator. Danach wird die Kopie gelöscht, sie wurde ja nur gebraucht um .begin() anzuwenden. Der Iterator zeigt nun auf eine nicht (mehr) vorhandene Collection. Der Rest ergibt sich 😉



  • AH!Verstanden! aber warum brauche ich const vector<double>& und nicht nur vector<double> &??


Anmelden zum Antworten