Es stellt sich heraus, dass dies eine viel interessantere Frage ist, als es zuerst erscheint.
tl; dr: Wenn Sie einen C++ 03 oder späteren Compiler verwenden, müssen Sie nicht stören.
Sie müssen den Unterschied zwischen value initialization und default initialization verstehen. Im Grunde werden bei der Initialisierung des Wertes alle Elemente auf Null gesetzt, und bei der Standardinitialisierung bleiben sie alle in Ruhe. Wenn eines der Standardelemente der Struktur (rekursiv) einen benutzerdefinierten Standardkonstruktor hat, wird dies sowohl vom Wert als auch von der Standardinitialisierung aufgerufen.
Beachten Sie, dass Wert Initialisierung viel besser als memset
auf Null, weil
- ist, wird es Standardkonstruktoren nennen
- Es wird Gleitkomma richtig initialisiert werden (auf 0,0) und Zeiger (NULL). Obwohl
memset
wird wahrscheinlich tun, dass auf Ihre Implementierung, es ist nicht garantiert.
Der normale Weg, um einen Vektor mit n Elemente zu erstellen, ist nur zu nennen:
std::vector<a> vec(n);
C++ 98
diese
std::vector<a>::vector(size_type count,
const T& value = T(),
const Allocator& alloc = Allocator());
nennen Das Objekt value
wird als Standardkonstrukt festgelegt ted, und Sie müssen die Elemente irgendwie initialisieren. Der beste Weg, dies zu tun, besteht darin, einen korrekt initialisierten Wert bereitzustellen, der kopiert werden soll. Also:
const static a azeroed; // Because this is static, it will be value initialized
std::vector<a> vec(20,azeroed);
Technische Anmerkung: Der C++ 98-Standard enthält nicht den Begriff „Wert der Initialisierung“, aber die Initialisierung von azeroed
ist identisch.
C++ 03
demselben Vektor-Konstruktor aufgerufen wird, aber von C++ 03, das value
Argument ist Wert initialisiert (so alles in den Garten rosig ist).
C++ 11
Der Anruf wird an
std::vector<a>::vector(size_type count);
welcher Wert direkt die Elemente initialisiert.
C++ 14
Der Anruf wird an
std::vector<a>::vector(size_type count, const Allocator& alloc = Allocator());
(im Allgemeinen, sie erkannten, dass sie das Zuordner Argument vergessen hat). Es gibt einen sehr feinen Unterschied darin, dass die Elemente durch Aufrufe von Allocator::construct
erstellt werden, und obwohl der Standardzuordner die Werte initialisiert, ist es möglich, eine benutzerdefinierte Version bereitzustellen, die dies nicht tut (siehe this answer). Wenn Sie das tun, wissen Sie fast sicher, was Sie tun.
Fazit
- Sofern Sie einen echten C++ 98-Compiler verwenden, brauchen Sie nicht memset
- zu nennen Providing ist einen explizit initialisiert Wert auf den Vektor Konstruktor legt Wert sicherer als Aufruf memset.
- memset kann nicht integrierte Werte nicht richtig initialisieren (obwohl dies wahrscheinlich der Fall ist).
- memset wird definitiv clobber alles wird ein richtiger Konstruktor. Dies ist eine große Wartungsgefahr. Wenn ein Wartungsprogrammierer die Struktur ändert, so dass es nicht mehr POD ist, wird der Code immer noch kompilieren - es wird nur die falsche Sache tun.
- Es gibt eine Menge zu sagen, nur um die Struktur einen richtigen Standardkonstruktor geben, und dann müssen Sie sich keine Sorgen machen, ob eines der Elemente initialisiert werden, auch wenn Sie eine lokale Kopie haben.
Was hat Sie daran gehindert, die Dokumentation 'std :: vector' zu lesen? Warum haben Sie sich entschieden, 'memset' zu verwenden? Was hast du versucht, nachdem du zu diesem Schluss gekommen bist? –
@LightnessRacesinOrbit: std :: vector wird normalerweise den Standardkonstruktor für die Objekte aufrufen, die es enthält. Da diese Struktur nur eingebaute Typen sind, werden die Elemente nicht initialisiert. –
@MartinBonner: Ja, ich bin mir dessen bewusst. Der OP muss einige Forschungen durchführen, um herauszufinden, wie man seine Elemente auf Null setzt.Diese Frage hat keinen Forschungsaufwand. Ich versuche, das OP dazu zu bringen, einige Untersuchungen durchzuführen. –