9Hvordan håndterer `std::vector` kapacitet, vækst, genallokering og iterator-stabilitet?
`std::vector` gemmer elementer i et sammenhængende hukommelsesområde og holder styr på både størrelse og kapacitet. Størrelsen (`size`) er antallet af konstruerede elementer; kapaciteten (`capacity`) er den mængde allokeret lagerplads til elementer, der er tilgængelig, før en ny allokering er nødvendig. Når tilføjelsen af elementer vil overskride kapaciteten, allokerer `vector` en større blok, typisk ved brug af en implementeringsdefineret geometrisk vækststrategi, flytter eller kopierer eksisterende elementer, destruerer de gamle og frigiver det gamle hukommelsesområde. `reserve(n)` øger kapaciteten uden at ændre størrelsen, mens `resize(n)` ændrer størrelsen ved at konstruere eller destruere elementer. Genallokering ugyldiggør alle iteratorer, referencer og pointere til elementer; selv uden genallokering kan operationer som `insert` og `erase` ugyldiggøre positioner ved eller efter ændringspunktet.
Prøv at besvare dette spørgsmål med en AI-coach
10Hvilke invalideringsregler bør du kende for sammenhængende (contiguous) og node-baserede standardcontainere?
Invalideringsregler afhænger af containeren og operationen. Sammenhængende containere som `vector` og `string` har skrøbelig stabilitet for iteratorer og referencer: Vækst kan medføre reallokering og invalidere alle iteratorer, referencer og pointere, og indsættelse/sletning kan forskyde elementer og invalidere positioner ved eller efter ændringen, selv uden reallokering. Node-baserede ordnede containere som `list`, `map`, `set` og deres multi-varianter holder generelt iteratorer og referencer til eksisterende, ikke-slettede elementer stabile under indsættelse; sletning af et element invaliderer iteratoren/referencen til det pågældende slettede element. Uordnede containere (unordered containers) gemmer også elementer i noder, så referencer og pointere til elementer er generelt stabile under rehash, men rehash invaliderer iteratorer. `deque` har særlige regler for segmenteret lagring. I praksis bør du tjekke den specifikke container og operation, før du gemmer iteratorer eller referencer på tværs af modifikationer.
Prøv at besvare dette spørgsmål med en AI-coach
11Sammenlign `std::map`, `std::unordered_map` og flat-map-lignende beholdere til opslagstabeller i backend-udvikling.
`std::map` er en sorteret, oftest træbaseret associativ beholder med logaritmisk tid til opslag, indsættelse og sletning; den er nyttig, når sorteret gennemløb (iteration), intervalforespørgsler (range queries) eller garantier om rækkefølge er vigtige. `std::unordered_map` er baseret på en hashtabel med gennemsnitlig konstant tid for operationer med eksakte nøgler og uden sortering af nøglerne; det er ofte et godt standardvalg til store, foranderlige opslagstabeller, når hashingen er effektiv. En flat-map-lignende beholder gemmer sorterede nøgle/værdi-par sammenhængende i hukommelsen, hvilket giver god cache-lokalitet og hurtigt gennemløb samt opslag med binær søgning, men indsættelse og sletning i midten af beholderen tager lineær tid. Til opslagstabeller i backend-udvikling bør man vælge ud fra, om arbejdsbyrden kræver sortering/intervaller, primært eksakte opslag, hyppige ændringer, forudsigelig latenstid, hukommelses-overhead eller en bestemt cache-adfærd.
Prøv at besvare dette spørgsmål med en AI-coach
12Forklar `std::optional` og typiske backend-anvendelsestilfælde til at repræsentere fraværende værdier.
`std::optional<T>` repræsenterer enten en indeholdt `T`-værdi eller ingen værdi. Den tomme tilstand repræsenteres af `std::nullopt`. I koden kan man kontrollere `has_value()` eller bruge den optionale værdi i en boolsk kontekst, tilgå værdien med `*` eller `value()`, og angive en standardværdi med `value_or()`. I backend-kode er det nyttigt til databasefelter, der kan være null, valgfrie forespørgsels- eller konfigurationsfelter, cache- eller database-missere, hvor fravær forventes, samt domænetilstande, hvor en markørværdi (sentinel value) som `-1` eller en tom streng ville være tvetydig. Det modellerer fraværet af en værdi, ikke polymorfi eller detaljeret fejlinformation.
Prøv at besvare dette spørgsmål med en AI-coach
13Hvad er `std::string_view` og `std::span`, og hvilke farer for objekters levetid (lifetime) introducerer views uden ejerskab (non-owning views)?
`std::string_view` er et view uden ejerskab af en sammenhængende tegnsekvens; `std::span<T>` er et view uden ejerskab af en sammenhængende sekvens af `T`. De er nyttige til zero-copy-parametre og buffer-API'er, fordi de indeholder en pointer og en længde uden at allokere eller eje hukommelse. Den primære fare relaterer sig til levetid: den refererede hukommelse skal leve længere end dit view og må ikke ugyldiggøres, mens viewet bruges. Hvis man returnerer eller gemmer et view, der peger på et midlertidigt objekt, et lokalt objekt, et destrueret objekt eller en reallokeret container, kan det resultere i et hængende view (dangling view).
Prøv at besvare dette spørgsmål med en AI-coach