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. |