Heim > Backend-Entwicklung > C++ > Wie gehen „std::vector::resize()' von C 11 und „resize()' von Boost.Container mit nicht initialisierten Elementen um?

Wie gehen „std::vector::resize()' von C 11 und „resize()' von Boost.Container mit nicht initialisierten Elementen um?

Linda Hamilton
Freigeben: 2024-11-30 09:15:14
Original
885 Leute haben es durchsucht

How Do C  11's `std::vector::resize()` and Boost.Container's `resize()`  Handle Uninitialized Elements?

Vektorverhalten in C 11 und Boost.Container: Umgang mit nicht initialisierten Elementen

In C-Anwendungen werden Vektoren häufig als temporäre Puffer verwendet. Um eine ausreichende Kapazität sicherzustellen, werden diese Vektoren häufig Größenänderungsvorgängen unterzogen. In C 03 erweitert die Funktion std::vector::resize() den Vektor durch Anhängen von Kopien eines angegebenen Werts. Während dieser Ansatz ungenutzte Elemente initialisiert, kann er ineffizient sein, wenn nur die Vektorgröße zählt.

C 11 hat zwei Überladungen von resize() eingeführt:

  • resize(size_type n): Führt einen Wert aus Initialisierung für nicht verwendete Elemente.
  • resize(size_type n, const value_type & val): Initialisiert nicht verwendete Elemente mit einer Kopie des bereitgestellter Wert.

Boost.Container erweitert diese Funktionalität um eine zusätzliche Überladung:

  • resize(size_type n, default_init_t): Führt eine Standardinitialisierung für nicht verwendete Elemente durch.

Um das Verhalten dieser Funktionen zu überprüfen, wurde ein Test mit C 11 durchgeführt std::vector und boost::container::vector:

  1. Gefüllte Vektoren mit Werten [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].
  2. Einige Elemente entfernt, um Vektoren mit der gewünschten Größe zu erstellen [0, 1, 2, 3, 4].
  3. Größe der Vektoren auf 10 Elemente mithilfe unterschiedlicher resize()-Überladungen geändert.
  4. Die aktualisierten Vektoren wurden gedruckt.

Erwartetes Verhalten

Für den C 03 std::vector sollten die nicht verwendeten Elemente vorhanden sein mit Nullen initialisiert. Es wurde erwartet, dass die boost::container-Varianten das Verhalten von C 03 emulieren, wenn sie im C 03-Modus kompiliert werden, und ein anderes Verhalten zeigen, wenn sie im C 11-Modus kompiliert werden.

Tatsächliche Ergebnisse

Überraschenderweise zeigten die Testergebnisse, dass sowohl std::vector und boost::container::vector zeigte das gleiche Verhalten. In allen Fällen wurden die nicht verwendeten Elemente mit Nullen initialisiert, unabhängig von der verwendeten resize()-Überladung.

Erklärung

Dieses unerwartete Verhalten deutet darauf hin, dass die resize()-Schnittstelle Die in C 11 eingeführte Änderung hat im gegebenen Szenario keine praktische Auswirkung. Die C 03 std::vector::resize()-Funktion initialisiert standardmäßig nicht verwendete Elemente. In C 11 bieten die resize()-Überladungen zusätzliche Optionen für die explizite Initialisierung, sie ändern jedoch nicht das Standardverhalten der Standardinitialisierung nicht verwendeter Elemente. Das gleiche Verhalten spiegelt sich in der Boost.Container-Implementierung wider.

Auswirkungen

Wenn Sie vermeiden müssen, nicht verwendete Elemente mit Nullen zu initialisieren, können Sie einen benutzerdefinierten Allokator verwenden, der die Methode „construct()“ von std::allocator abfängt und die Wertinitialisierung durch die Standardinitialisierung ersetzt. Gehen Sie jedoch mit Vorsicht vor, da die Anwendung dieser Vorgehensweise auf alle Initialisierungen zu unbeabsichtigten Folgen führen kann.

Das obige ist der detaillierte Inhalt vonWie gehen „std::vector::resize()' von C 11 und „resize()' von Boost.Container mit nicht initialisierten Elementen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage