PDA

View Full Version : [C++] std::vector e std::list


bulmachan
12-09-2008, 22:49
Scusate la domanda che per molti può sembrare un'eresia, quali sono i casi in cui è meglio (o più appropriato) utilizzare std::vector piuttosto che std::list? Proprio non ci arrivo :muro:
Nella mia ingenuità pensavo che con std::vector bisognasse definire una dimensione massima predefinita (quindi più di un tot push_back non si possono fare causa overflow, mi viene da assciare vector agli array, quindi se ho un array che può contenere al più 10 elementi non posso mettercene 11), mentre con list il problema non si pone (associo list all'idea di qualcosa di dimanico).
Se v è definito come std::vector<int> v; e riempio il vettore di valori,
for (int i = 0; i < n; ++i)
std::cout << v[i] << std::endl;
return 0; mi stampa i valori in esso contenuti, quindi posso accedere agli elemento iesimo con v[i].

Se l è la mia lista std::list<int> l;
for(list<int>::iterator ai=l.begin(); ai!=l.end(); ++ai) cicla dal primo all'ultimo elemento.
Come faccio limitare il mio for partendo dall'elemento jesimo e arrivando solo al kesimo?
Grazie in anticipo.

Tommo
12-09-2008, 23:56
Non puoi in maniera semplice mi sa... nelle liste gli elementi non hanno una posizione assoluta, ma solo relativa al vicino.
Per cui da begin devi iterare saltando gli elementi fino a J, e quindi iterare come vuoi fino a K.

Cmq pare che le liste siano da preferire in casi di massicci inserimenti e rimozioni, dato che possono eseguirle in tempo costante; i vettori invece sono più veloci nell'essere iterati, penso.

bulmachan
18-09-2008, 21:16
Ok, grazie.
Io devo fare un inserimento di tutti quanti gli elementi quando inizializzo (leggendo i dati a file) e poi devo fare dei gran cicli (ad essere precisi applicare un algoritmo ricorsivo divide et impera), nessuna ricerca in base ad un indice, ma solo sulla posizione dell'elemento ne eliminazioni. Quindi in effetti sono meglio i vector.
Mi puoi confermare che con i vector non ho problemi di overflow e quindi non sono "analoghi" agli array su questo aspetto? Non posso ipotizzare a priori la dimensione massima dei dati da inserire e voglio evitare realloc (stavo appunto ipotizzando di usare liste (o vettori) proprpio x questo).
Oppure mi consigliate strutture dati alternative?

Tnk! :)

cionci
19-09-2008, 11:15
Ok, grazie.
Io devo fare un inserimento di tutti quanti gli elementi quando inizializzo (leggendo i dati a file) e poi devo fare dei gran cicli (ad essere precisi applicare un algoritmo ricorsivo divide et impera), nessuna ricerca in base ad un indice, ma solo sulla posizione dell'elemento ne eliminazioni. Quindi in effetti sono meglio i vector.
Se non utilizzassi list o vector, utilizzeresti una lista ? Se la risposta è sì allora ti va bene list, altrimenti ti va bene vector.
Mi puoi confermare che con i vector non ho problemi di overflow e quindi non sono "analoghi" agli array su questo aspetto? Non posso ipotizzare a priori la dimensione massima dei dati da inserire e voglio evitare realloc (stavo appunto ipotizzando di usare liste (o vettori) proprpio x questo).
Non hai problemi di questo tipo. Tu continui ad usare il metodo push_back e lui ti mette l'elemento in fondo al vettore e te lo allarga automaticamente.

bulmachan
22-09-2008, 18:15
Se non utilizzassi list o vector, utilizzeresti una lista ? Se la risposta è sì allora ti va bene list, altrimenti ti va bene vector.

Il mio dubbio deriva proprio da questo, userei le liste e non l'array perchè non so a priori la quantità di dati e non voglio effettuare delle realloc (sono troppo onerose), questo ragionamento mi poratava ad utilizzare list, ma se invece ragiono sul tipo di perazioni che effettuerei (applicazione di un algortimo divide et impera su sottosegmenti della mia struttura dati) mi verrebbe da preferire i vector.

Grazie per la precisazione

cionci
23-09-2008, 07:08
Non fare un discorso specifico del linguaggio, ma fanne una questione algoritmica. In quell'algoritmo utilizzeresti liste o vettori ?