iterator
-
nein es ist nicht
ich habe diese Get-Funktionen geschrieben, aber ich wollte hier Platz sparenNoch 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 funktioniertDANKE!
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> &??
-
Wenn du kein const davor hast, kann jeder der die Referenz erhält das Objekt, d.h deine PRIVATE Variable ändern !