std::vector en std::list zijn verschillende STL-containers met verschillende implementaties en gedrag.
Wanneer te kiezen:
std::vector bijna altijd, tenzij je frequente invoegingen/verwijderingen in het midden nodig hebt.std::list is gerechtvaardigd als invoegingen/verwijderingen op elke plaats nodig zijn bij een grote hoeveelheid gegevens, wanneer het verplaatsen van vector-elementen te duur is.std::vector vaak sneller door de gegevenslokaliteit.Voorbeeld:
std::vector<int> v; v.push_back(1); v[0] = 2; // snelle toegang op index std::list<int> l; l.push_back(1); // l[0] = 2; // Fout: std::list heeft geen toegang op index!
"Waarom wordt std::list bijna niet gebruikt in moderne C++-projecten, ondanks het theoretische voordeel bij frequente invoegingen in het midden van de collectie?"
Antwoord:
Omdat in de praktijk vanwege talloze kleine allocaties, verlies van gegevenslokaliteit (cache-friendly), omvangrijke structuren en slechte ondersteuning voor sommige bewerkingen (std::list is zelfs niet efficiënt voor grote lijsten vanwege de tijdsverlies door allocatie en deallocatie, en vertraging door cache-misses overstijgt vaak de asymptotische winst). Bovendien zijn moderne processors zeer gevoelig voor cache-lokaliteit, dus zelfs bij grote hoeveelheden gegevens is std::vector vaak sneller onder echte omstandigheden.
Verhaal
In realtime systemen werd std::list gekozen voor het opslaan van een gebeurtenissenqueue vanwege frequente verwijderingen van willekeurige posities. Het resultaat was dat het systeem 10 keer langzamer werd vanwege frequente toegang tot de heap en slechte gegevenslokaliteit in het geheugen.
Verhaal
In een grafische processor werden buurarrays opgeslagen als std::list voor de invoegingen. Dit leidde tot een dramatische toename van het geheugengebruik en degradatie van L1/L2 caches, zonder dat er echte snelheidwinst werd behaald.
Verhaal
In een rapportage-service werd elk rapport samengesteld uit Linked List-objecten. In stresstests begon de service "te vertragen", en profilering toonde knelpunten in de kosten voor allocatie bij het werken met lijsten. Ze zijn overgestapt naar vector — het resultaat verbeterde meerdere keren.