La risposta breve è che i casi sembrano essere pochi e distanti tra loro. Ci sono probabilmente alcuni però.
Si potrebbe essere quando è necessario memorizzare un piccolo numero di oggetti di grandi dimensioni, in particolare oggetti così grandi da non essere in grado di allocare spazio anche per alcuni di essi. Non c'è praticamente alcun modo per fermare un vettore o un deque dall'assegnare spazio per oggetti extra - è come sono definiti (cioè, devono allocare spazio extra per soddisfare i loro requisiti di complessità). Se non riesci impossibile a consentire che lo spazio aggiuntivo venga assegnato, un std::list
potrebbe essere il contenitore standard solo che soddisfa le tue esigenze.
Un altro sarebbe quando / se memorizzerai un iteratore in un punto "interessante" in un elenco per un lungo periodo di tempo, e quando fai degli inserimenti e / o delezioni, lo fai (quasi) sempre da un punto in cui hai già un iteratore, quindi non scorrere l'elenco per arrivare al punto in cui stai andando a fare l'inserimento o la cancellazione. Ovviamente lo stesso si applica se lavori con più di un punto, ma stai ancora programmando di archiviare un iteratore in ogni posto con cui probabilmente lavorerai, in modo da manipolare i punti che puoi raggiungere direttamente e solo raramente attraverso l'elenco per ottenere a quei punti.
Per un esempio del primo, considera un browser web. Potrebbe mantenere un elenco collegato di oggetti Tab
, con ciascun oggetto scheda che rappresenta nella scheda aperta nel browser. Ogni scheda potrebbe contenere alcune decine di megabyte di dati (di più, soprattutto se è coinvolto qualcosa come un video). Il tuo numero tipico di schede aperte potrebbe facilmente essere inferiore a una dozzina, e 100 è probabilmente vicino all'estremo superiore.
Per un esempio del secondo, considera un elaboratore di testi che memorizza il testo come un elenco collegato di capitoli, ognuno dei quali potrebbe contenere un elenco collegato di (dire) paragrafi. Quando l'utente sta modificando, in genere troverà un punto preciso in cui verrà modificato e quindi eseguirà una buona quantità di lavoro in quel punto (o comunque all'interno di quel paragrafo). Sì, passeranno da un paragrafo all'altro di tanto in tanto, ma nella maggior parte dei casi sarà un paragrafo vicino a dove stavano già lavorando.
Una volta ogni tanto (cose come ricerca e sostituzione globali) si finisce per percorrere tutti gli elementi di tutte le liste, ma è abbastanza raro, e anche quando lo fai, probabilmente farai abbastanza ricerche di lavoro all'interno un elemento nella lista, che il tempo di attraversare la lista è quasi irrilevante.
Si noti che in un caso tipico, è probabile che questo si adatti anche al primo criterio - un capitolo contiene un abbastanza piccolo numero di paragrafi, ognuno dei quali è probabile che sia abbastanza grande (a meno relativo alla dimensione dei puntatori nel nodo, e tale). Allo stesso modo, hai un relativamente piccolo numero di capitoli, ognuno dei quali potrebbe essere di diversi kilobyte o giù di lì.
Detto questo, devo ammettere che entrambi questi esempi sono probabilmente un po 'forzati, e mentre una lista collegata potrebbe funzionare perfettamente per entrambi, probabilmente non offrirebbe un enorme vantaggio in entrambi i casi. In entrambi i casi, ad esempio, l'allocazione di spazio aggiuntivo in un vettore per alcune (vuote) pagine web / schede o alcuni capitoli vuoti è improbabile che costituisca un problema reale.