9Hoe beheert `std::vector` capaciteit, groei, herallocatie en de stabiliteit van iterators?
`std::vector` slaat elementen aaneengesloten op en houdt zowel `size` als `capacity` bij. `size` is het aantal geconstrueerde elementen; `capacity` is de hoeveelheid toegewezen opslagruimte voor elementen die beschikbaar is voordat een nieuwe allocatie nodig is. Wanneer het toevoegen van elementen de capaciteit zou overschrijden, wijst de vector een groter blok toe, meestal met behulp van een implementatie-afhankelijke geometrische groeistrategie. Hierbij verplaatst of kopieert de vector bestaande elementen, vernietigt hij de oude elementen en geeft hij de oude opslagruimte vrij. `reserve(n)` verhoogt de capaciteit zonder de grootte te veranderen, terwijl `resize(n)` de grootte verandert door elementen te construeren of te vernietigen. Herallocatie maakt alle iterators, referenties en pointers naar elementen ongeldig; zelfs zonder herallocatie kunnen bewerkingen zoals `insert` en `erase` posities op of na het wijzigingspunt ongeldig maken.
Probeer deze vraag te beantwoorden met een AI-begeleider
10Welke invalidatieregels moet je kennen voor aaneengesloten en op nodes gebaseerde standaardcontainers?
Invalidatieregels hangen af van de container en de operatie. Aaneengesloten containers zoals vector en string hebben een kwetsbare stabiliteit qua iterators en referenties: groei kan leiden tot herallocatie en alle iterators, referenties en pointers ongeldig maken. Ook kunnen insert- en erase-operaties elementen verschuiven, waardoor posities op of na de wijziging ongeldig worden, zelfs zonder herallocatie. Geordende, op nodes gebaseerde containers zoals list, map, set en hun multi-varianten houden iterators en referenties naar bestaande, niet-gewiste elementen over het algemeen stabiel tijdens invoegoperaties; het wissen van een element invalideert uitsluitend de iterator of referentie naar dat specifieke gewiste element. Ongeordende containers slaan elementen ook op in nodes, waardoor referenties en pointers naar elementen doorgaans stabiel blijven tijdens een rehash, maar een rehash maakt iterators wel ongeldig. Voor deque gelden speciale regels voor gesegmenteerde opslag. In de praktijk is het raadzaam om de specifieke container en operatie te controleren voordat je iterators of referenties over containerwijzigingen heen bewaart.
Probeer deze vraag te beantwoorden met een AI-begeleider
11Vergelijk `std::map`, `std::unordered_map` en containers in de stijl van een flat-map voor zoektabellen in een backend.
`std::map` is een geordende, doorgaans op bomen gebaseerde associatieve container met logaritmische complexiteit voor opzoeken, invoegen en verwijderen; het is nuttig wanneer gesorteerde iteratie, bereikquery's of indelingsgaranties belangrijk zijn. `std::unordered_map` is gebaseerd op hashtabellen met een gemiddelde constante tijd voor bewerkingen op exacte sleutels en zonder sleutelordening; het is vaak een goede standaardkeuze voor grote, veranderlijke zoektabellen als de hashfunctie goed is. Een container in flat-map-stijl slaat gesorteerde sleutel-waardeparen aaneengesloten op, wat een goede cachelokaliteit en snelle iteratie/opzoeken met binaire zoekopdrachten oplevert, maar invoegen en verwijderen in het midden kosten lineaire tijd. Kies voor zoektabellen in een backend op basis van de vraag of de werklast ordening of bereiken vereist, voornamelijk exact opzoeken nodig heeft, vaak muteert, of er behoefte is aan voorspelbare latentie, geheugenoverhead en specifiek cachegedrag.
Probeer deze vraag te beantwoorden met een AI-begeleider
12Leg `std::optional` uit en typische backend-toepassingen voor het weergeven van ontbrekende waarden.
`std::optional<T>` vertegenwoordigt ofwel een aanwezige `T`-waarde ofwel geen waarde. De lege status wordt weergegeven door `std::nullopt`; code kan `has_value()` controleren of de optional in een booleaanse context gebruiken, de waarde benaderen met `*` of `value()`, en een standaardwaarde opgeven met `value_or()`. In backend-code is het nuttig voor databasevelden die null mogen zijn, optionele request- of configuratievelden, ontbrekende waarden in caches of repositories waarbij afwezigheid wordt verwacht, en domeinstatussen waarbij een sentinelwaarde zoals `-1` of een lege string dubbelzinnig zou zijn. Het modelleert de afwezigheid van een waarde, geen polymorfisme of uitgebreide foutinformatie.
Probeer deze vraag te beantwoorden met een AI-begeleider
13Wat zijn std::string_view en std::span, en welke gevaren met betrekking tot de levensduur introduceren views zonder eigenaarschap?
std::string_view is een view zonder eigenaarschap van een aaneengesloten reeks tekens; std::span<T> is een view zonder eigenaarschap van een aaneengesloten reeks van T. Ze zijn nuttig voor zero-copy-parameters en buffer-API's, omdat ze een pointer en een lengte bevatten zonder geheugen toe te wijzen of als eigendom te beheren. Het belangrijkste gevaar is de levensduur: de gerefereerde opslag moet langer blijven bestaan dan de view en mag niet ongeldig worden gemaakt zolang de view in gebruik is. Het retourneren of opslaan van een view naar een tijdelijk object, een lokaal object, een vernietigd object of een geheralloceerde container kan leiden tot een dangling view.
Probeer deze vraag te beantwoorden met een AI-begeleider