Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Inhalt eines Vektors

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.03.2008, 10:05 Uhr
~FreiherrEintritt
Gast


Kann ich i.A. den Inhalt eines std::vectors über einen Zeiger auf das erste Element ansprechen, um den gesamten Inhalt z.B. per memcpy in einen primitiven Array zu kopieren? In den bisherigen Versuchen hat es immer funktioniert, aber ich dachte er speichert es unter Umständen anders ab.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.03.2008, 11:15 Uhr
ao

(Operator)


Bin mir nicht 100 % sicher, aber nach dieser Beschreibung würde ich sagen, ja, das ist bei std::vector eine zugesicherte Eigenschaft:

www.cppreference.com/cppvector/index.html : "Vectors contain contiguous elements stored as an array ..."
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.03.2008, 11:29 Uhr
xXx
Devil


Jap steht auch so im Standard. D.h. std::vector<T> x; T* ptr_first = &x[0]; ist io. Memcpy dazu zu nutzen aber unter Umständen nicht. Wofür du das noch machen willst ist aber auch nicht klar ... kannst doch auch so problemlos drauf zugreifen?!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.03.2008, 11:48 Uhr
ao

(Operator)



Zitat von xXx:
Memcpy dazu zu nutzen aber unter Umständen nicht.

Warum nicht? Konkrete Einwände? Wenn &v[0] die Adresse des ersten Elements liefert und der Speicher zusammenhängt, ist doch alles klar, oder?

Zitat:
Wofür du das noch machen willst ist aber auch nicht klar ... kannst doch auch so problemlos drauf zugreifen?!

Hat er doch gesagt: Er will den Inhalt in ein C-Style-Array kopieren, aber nicht elementweise, sondern mit memcpy.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.03.2008, 15:08 Uhr
0xdeadbeef
Gott
(Operator)


Also, genau genommen ist das folgendermaßen: Ein vector nimmt zwei template-Argumente entgegen, den Wert-Typ und einen allocator - der ist per default std::allocator<Wert-Typ>.

std::vector<T, A>::operator[] gibt ein Argument vom Typ std::vector<T, A>::reference zurück, sofern T nicht bool ist (std::vector<bool> packt die Bits, dementsprechend ist linearer Zugriff nicht möglich), und std::vector<T, A>::reference ist A::reference. Für std::allocator<T> ist das T&.

Ferner beschreiben die Voraussetzungen für eine allocator-Klasse (20.1.5 im Standard) unter anderem, dass eine in Standardcontainern verwendbare Allocator-Klasse ein typedef T &reference haben muss, womit wir für std::vector<T, *>::reference (für alle T != bool) wieder bei T& sind. (Wie das mit std::vector<bool> zusammenspielt, ist mir auch nicht völlig klar).

Da std::vector also eine ununterbrochene Speicherung der Daten garantiert und reference = T& auch gegeben ist (für alle Typen außer bool), und std::vector sogar ausdrücklich &v[n] == &v[0] + n vorgibt, ist std::memcpy hier benutzbar, solange

1. du keinen vector<bool> hast
2. der Vektor keine komplexen Datentypen enhält (Allerdings würde ich genau aus diesem Grund die Benutzung von std::copy vorschlagen)
3. du nicht in den Vektor kopierst und
4. du einen standardkonformen Allokator benutzt.

Nachtrag:

Oh, und

5. Du den Vektor nicht gleichzeitig in mehreren Threads benutzt, wegen möglicher Reallokation und so.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 20.03.2008 um 15:09 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.03.2008, 16:38 Uhr
~FreiherrEintritt
Gast


Vielen Dank!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.03.2008, 20:18 Uhr
xXx
Devil


@ao: Ich bezog mich auf Punkt 2 von 0xdeadbeef's Argumenten ... => std::copy.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: