zeigerarithmetik bei vector
-
heo
kann man eigentlich mit Zeigern auf vectoren zugreifen, wenn ja wie?
vector<double> v1; vector<double> *erg = &v1; //v1 befüllen v1.push_back(3.0); v1.push_back(3.0); v1.push_back(2.1); v1.push_back(6.6); v1.push_back(0.5); for (unsigned int i = 0; i < erg->size();i++) cout<<*(erg+i)<<endl;aber so funktioniert das nicht, hat jemand eine idee wieso?
kann man nur mit iteratoren darauf zugreifen?mfg
-
Was soll denn 'erg' hier darstellen und was willst du erreichen?
(wenn du die Elemente eines vector<> auslesen willst - das geht mit "Iteratoren" (ein Zeiger-Ersatz, der sich an die Struktur des unterliegenden Containers anpassen kann))
-
ja erg ist ein zeiger auf das erste element des vectors, mit *erg sollte man doch genauso wie mit einem iterator = erg->begin() das erste element anzeigen lassne können.
-> ich bräuchte das da ich an einem sortierprogramm arbeitet und spätestens bei heapsort brauche ich jetzt zeigerarithmetik da man ja iterators nicht miteinander multipliziern usw kann....
mfg
-
d3f3nd3r schrieb:
ja erg ist ein zeiger auf das erste element des vectors, mit *erg sollte man doch genauso wie mit einem iterator = erg->begin() das erste element anzeigen lassne können.
Und was soll das auf deutsch heißen? Zeig doch mal etwas mehr - und etwas zusammenhängenderen Code.
-> ich bräuchte das da ich an einem sortierprogramm arbeitet und spätestens bei heapsort brauche ich jetzt zeigerarithmetik da man ja iterators nicht miteinander multipliziern usw kann....
Kannst du mit Zeigern auch nicht - Iteratoren wurden bewußt so ausgelegt, daß sie die Pointer-Arithmetik imitieren können (und die Random-Access-Iteratoren von vector<> oder deque<> sogar mit vollem Funktionsumfang)
btw, es ist durchaus zulässig, daß vector<T>::iterator ein typedef auf T* ist

-
Hallo,
Der std::vector<T> garantiert (laut standard), dass die elemente en-bloc im Speicher sind. Das heisst es ist u.U. ok die Adresse des ersten Elements als Pointer auf den Anfang des internen Arrays zu benützten.
ABER: Das kann heikel sein, wenn z.B. ein neues Element (mit push_back) hinzugefügt wird und intern kein Speicher mehr zur Verfügung steht wird neues Memory alloziert und die Adresse des ersten Elements ändert.Zudem frage ich warum man das tun möchte??
DENN: Es gibt das Konzept der Iteratoren - die sind dann auch für andere STL Container (z.B. für eine std::list<T>) benützbar. (Wie CStoll schon erwähnt hat.)
Zudem frage ich, warum nicht die sotier Möglichkeiten der jeweiligen Container oder std::sort benützen?
simon
-
@d3f3nd3r
Bei dir ist erg eben nicht ein Zeiger auf das erste Element des vectors sondern auf den vector selbst. Vektoren verhalten sich hier nicht wie normale Arrays.
Das hier wäre ein Zeiger auf das erste Element des vektors.double* erg = &(v1[0]);
-
d3f3nd3r schrieb:
ja erg ist ein zeiger auf das erste element des vectors, ...
Nö !
Du schreibst doch selbst, was erg ist:d3f3nd3r schrieb:
...
vector<double> v1; vector<double> *erg = &v1;...
= ein Zeiger auf v1. Und v1 ist ein vector<double>....
Gruß,
Simon2.
-
Sagte ich ja.

-
ja danke genau das war meine frage

aber ich habe auch schon eine idee wie ichs mit iteratoren implementiere, jetzt wo ich langsam das konzept verstehe

thx
-
mit deinem Zeiger könntest du einfach per *erg.at(i) den Wert ausgeben ...
-
Braunstein schrieb:
@d3f3nd3r
Bei dir ist erg eben nicht ein Zeiger auf das erste Element des vectors sondern auf den vector selbst. Vektoren verhalten sich hier nicht wie normale Arrays.
Das hier wäre ein Zeiger auf das erste Element des vektors.double* erg = &(v1[0]);Genau, und mit diesem double* kannst du dann munter Zeigerarithmetik wie im Normalen Array betreiben:
double* erg = &(v1[0]); erg += 5; //zeigt jetzt auf &v1[0] + 5 = v1[5] erg=&v1[0]; double* erg2=&v1[0]; for (unsigned int i = 0; i < v1.size(); ++i, ++erg2) cout<< *(erg+i) << ' ' << v1[i] << ' ' << *erg2 << endl; //alles das selbeDass das funktioniert, ist im Standard garantiert, sprich, dass der Inahtl des Vectors in einem einzelnen Array untergebracht ist. (Daher auch der schnelle Zugriff und das unter umstaenden kostspielige Erweitern, wenn der reservierte Platz nimmer reicht muss der ganze Ramsch in ein neues, groesseres Array kopiert werden.)