Fragen zu Arrays in C++
-
Danke!
.filmor schrieb:
Hmm, ich denke &vec[0] ist da sicherer, das müsste auch portabel sein, denn so bekommst du garantiert (wenn nicht irgend ein Hornochse den unären &-Operator umdefiniert hat ;)) einen Zeiger auf den Anfang.
Dann müsste ich aber davon ausgehen, dass die verwendete STL-Vectorimplementierung die Daten wirklich in einem Array ablegt, in dem sie hintereinanderliegen (und nicht z.B. in einer verketteten Liste).
-
Das ist AFAIK so festgelegt. Ein STL-Vector muss die Daten in einem zusammenhängenden Block anlegen.
-
.filmor schrieb:
Das ist AFAIK so festgelegt. Ein STL-Vector muss die Daten in einem zusammenhängenden Block anlegen.
Anders geht des doch net, wenn man die für vector definierten O()'s einhalten will, oder? Aber ich glaube nicht, dass es so festgelegt ist...
-
Ja stimmt! Die O()s.
Aber die könnte man evtl. auch einhalten, wenn man eine verkette Liste verwenden würde und auf jeden Eintrag nochmals einen Zeiger hätte und diese Zeiger dann in einem Array.
-
vector legt seine daten in einem array ab, in C++98 war das noch offen gelassen (aber jede implementation tut es), in C++03 wurde das dann explizit in den standard aufgenommen. das standard-idiom, um einen zeiger zu bekommen, ist im übrigen &*container.begin() - das wird in der bibliothek auch verwendet (und ist der grund, warum operator& für solche objekte nicht überladen werden darf (oder zumindest nicht so, das etwas anderes herauskommt). daraus, dass vector seine daten in einem array speichert, ist allerdings keineswegs zu folgern, dass seine iteratoren zeiger sein müssen. die bedingungen sind so formuliert, dass sie es sein können, aber nichts in der standardbibliothek erfordert das explizit - denkbar sind z.b. 'checked'-iteratoren, die die grenzen des vectors beim zugriff überprüfen.
P.S. aus den O()s kann man nicht wirklich auf die implementation von vector schließen: ein deque genügt ebenfalls allen komplexitätsanforderungen eines vectors, kann allerdings keineswegs als array implementiert werden.
-
Hallo nochmal,
Freak_Coder schrieb:
Hi,
Struktur *array = new Struktur[vektor.size()];das funzt leider nicht so recht (hab da wohl noch einen Fehler).
Bei:struct Struktur *s; s = new struct Struktur[vektor.size()];Sacht mir der G++: Incompatible types in assignment of 'Struktur *' to 'Strukur[0]'
Muss ich da noch ein & vor new stellen?
-
Reth schrieb:
struct Struktur *s; s = new struct Struktur[vektor.size()];das wiederholen von struct ist nicht notwendig (ich bin nicht mal sicher, ob das hier überhaupt zulässig ist). C++ hat keinen getrennten namensraum für tagnamen. es könnte höchtens dann nötig sein, wenn Struct zuvor nicht deklariert wurde - aber da new nicht mit unvollständigen typen verwendet werden kann, spielt das hier keine rolle.
-
.filmor schrieb:
Und es ist richtig, vor einem delete zu überprüfen, ob das Array existiert.
delete auf 0 macht garnix.
-
Reth schrieb:
Hallo nochmal,
Freak_Coder schrieb:
Hi,
Struktur *array = new Struktur[vektor.size()];das funzt leider nicht so recht (hab da wohl noch einen Fehler).
Bei:struct Struktur *s; s = new struct Struktur[vektor.size()];Sacht mir der G++: Incompatible types in assignment of 'Struktur *' to 'Strukur[0]'
Muss ich da noch ein & vor new stellen?
Naja
, ich lasse ja nicht umsonst das struct weg...In C++ brauchst du es NICHT mehr. Du musst nicht betonen das eine Struktur ne Struktur ist

-
Danke schön!
Mit ohne
structnimmts der Compiler zumindest schon mal!
Ciao