9Wie verwaltet std::vector Kapazität, Wachstum, Reallokation und Iterator-Stabilität?
std::vector speichert Elemente zusammenhängend und verfolgt sowohl size als auch capacity. size ist die Anzahl konstruierter Elemente; capacity ist der verfügbare allokierte Elementspeicher, bevor eine weitere Allokation nötig ist. Wenn das Hinzufügen von Elementen die Kapazität überschreiten würde, allokiert vector einen größeren Block, typischerweise mit einer implementationsdefinierten geometrischen Wachstumsstrategie, movet oder kopiert bestehende Elemente, zerstört die alten und gibt den alten Speicher frei. reserve(n) erhöht die Kapazität, ohne size zu ändern, während resize(n) size ändert, indem Elemente konstruiert oder zerstört werden. Reallokation invalidiert alle Iteratoren, Referenzen und Zeiger auf Elemente; selbst ohne Reallokation können Operationen wie insert und erase Positionen an oder nach dem Änderungspunkt invalidieren.
Diese Frage mit einem KI-Coach beantworten
10Welche Invalidierungsregeln sollte man für zusammenhängende und knotenbasierte Standardcontainer kennen?
Invalidierungsregeln hängen vom Container und der Operation ab. Zusammenhängende Container wie vector und string haben fragile Iterator-/Referenzstabilität: Wachstum kann reallokieren und alle Iteratoren, Referenzen und Zeiger invalidieren, und insert/erase kann Elemente verschieben und Positionen an oder nach der Änderung auch ohne Reallokation invalidieren. Knotenbasierte geordnete Container wie list, map, set und ihre multi-Varianten halten Iteratoren und Referenzen auf bestehende nicht gelöschte Elemente bei insert im Allgemeinen stabil; das Löschen eines Elements invalidiert den Iterator/die Referenz auf dieses gelöschte Element. Unordered-Container speichern Elemente ebenfalls in Knoten, daher bleiben Referenzen und Zeiger auf Elemente über Rehash hinweg im Allgemeinen stabil, aber Rehash invalidiert Iteratoren. deque hat besondere Regeln für segmentierten Speicher. In der Praxis sollte man den konkreten Container und die Operation prüfen, bevor man Iteratoren oder Referenzen über Modifikationen hinweg speichert.
Diese Frage mit einem KI-Coach beantworten
11Vergleichen Sie std::map, std::unordered_map und Container im Flat-Map-Stil für Lookup-Tabellen im Backend.
std::map ist ein geordneter, üblicherweise baumbasierter assoziativer Container mit logarithmischem Lookup/Einfügen/Löschen; er ist nützlich, wenn sortierte Iteration, Bereichsabfragen oder Ordnungsgarantien wichtig sind. std::unordered_map basiert auf einer Hashtabelle mit im Durchschnitt konstanter Zeit für exakte Schlüsseloperationen und ohne Schlüsselordnung; er ist oft eine gute Standardwahl für große, veränderliche Lookup-Tabellen, wenn das Hashing gut ist. Ein Container im Flat-Map-Stil speichert sortierte Schlüssel/Wert-Paare zusammenhängend, bietet gute Cache-Lokalität und schnelle Iteration/binäre Suche, aber Einfügen und Löschen in der Mitte sind linear. Für Backend-Lookup-Tabellen wählen Sie je nachdem, ob die Last Ordnung/Bereiche, überwiegend exakte Lookups, häufige Mutation, vorhersehbare Latenz, Speicher-Overhead und Cache-Verhalten benötigt.
Diese Frage mit einem KI-Coach beantworten
12Erklären Sie std::optional und typische Backend-Anwendungsfälle zur Darstellung fehlender Werte.
std::optional<T> repräsentiert entweder einen enthaltenen T-Wert oder keinen Wert. Der leere Zustand wird durch std::nullopt dargestellt; Code kann has_value() prüfen oder das optional im booleschen Kontext nutzen, den Wert mit * oder value() zugreifen und mit value_or() einen Default liefern. Im Backend ist es nützlich für nullable Datenbankfelder, optionale Request-/Konfigurationsfelder, Cache- oder Repository-Misses, bei denen Abwesenheit erwartet wird, und Domänenzustände, in denen ein Sentinel wie -1 oder ein leerer String mehrdeutig wäre. Es modelliert die Abwesenheit eines Werts, nicht Polymorphie oder reichhaltige Fehlerinformationen.
Diese Frage mit einem KI-Coach beantworten
13Was sind std::string_view und std::span, und welche Lebenszeitrisiken bringen nicht-besitzende Views mit sich?
std::string_view ist ein nicht-besitzender View auf eine zusammenhängende Zeichenfolge; std::span<T> ist ein nicht-besitzender View auf eine zusammenhängende Sequenz von T. Sie eignen sich für Zero-Copy-Parameter und Puffer-APIs, weil sie einen Zeiger und eine Länge tragen, ohne Speicher zu allozieren oder zu besitzen. Das Hauptrisiko ist die Lebenszeit: Der referenzierte Speicher muss den View überleben und darf nicht ungültig werden, solange der View verwendet wird. Das Zurückgeben oder Speichern eines Views auf ein Temporäres, ein lokales Objekt, ein zerstörtes Objekt oder einen reallokierten Container kann einen dangling View hinterlassen.
Diese Frage mit einem KI-Coach beantworten