QVector
es mayormente análogo a std::vector
, como se puede adivinar por el nombre. QList
está más cerca boost::ptr_deque
, a pesar de la aparente asociación con std::list
. No almacena objetos directamente, sino que almacena punteros a ellos. Obtiene todos los beneficios de las inserciones rápidas en ambos extremos, y las reasignaciones implican barajar punteros en lugar de constructores de copia, pero pierde la localidad espacial de un std::deque
o real std::vector
y gana muchas asignaciones de montón. Tiene alguna toma de decisiones para evitar las asignaciones de montón para objetos pequeños, recuperando la localidad espacial, pero por lo que entiendo, solo se aplica a cosas más pequeñas que un int
.
QLinkedList
es análogo std::list
y tiene todas sus desventajas. En términos generales, esta debería ser su última elección de contenedor.
La biblioteca QT favorece en gran medida el uso de QList
objetos, por lo que favorecerlos en su propio código a veces puede evitar un tedio innecesario. El uso adicional del montón y el posicionamiento aleatorio de los datos reales pueden, en teoría, dañar en algunas circunstancias, pero a menudo es imperceptible. Por lo tanto, sugeriría usar QList
hasta que el perfil sugiera cambiar a un QVector
. Si espera que la asignación contigua sea importante [lea: está interactuando con un código que espera un en T[]
lugar de un QList<T>
], eso también puede ser una razón para comenzar desde el principio QVector
.
Si está preguntando sobre contenedores en general y solo utilizó los documentos de QT como referencia, entonces la información anterior es menos útil.
An std::vector
es una matriz cuyo tamaño puede cambiar. Todos los elementos se almacenan uno al lado del otro y puede acceder a elementos individuales rápidamente. La desventaja es que las inserciones solo son eficientes en un extremo. Si pones algo en el medio, o al principio, tienes que copiar los otros objetos para hacer espacio. En notación de oh grande, la inserción al final es O (1), la inserción en cualquier otro lugar es O (N) y el acceso aleatorio es O (1).
An std::deque
es similar, pero no garantiza que los objetos se almacenen uno al lado del otro y permite que la inserción en ambos extremos sea O (1). También requiere que se asignen porciones más pequeñas de memoria a la vez, lo que a veces puede ser importante. El acceso aleatorio es O (1) y la inserción en el medio es O (N), lo mismo que para a vector
. La localidad espacial es peor que std::vector
, pero los objetos tienden a agruparse, por lo que obtienes algunos beneficios.
An std::list
es una lista vinculada. Requiere la mayor sobrecarga de memoria de los tres contenedores secuenciales estándar, pero ofrece una inserción rápida en cualquier lugar ... siempre que sepa de antemano dónde debe insertar. No ofrece acceso aleatorio a elementos individuales, por lo que debe iterar en O (N). Pero una vez allí, la inserción real es O (1). El mayor beneficio std::list
es que puede unirlos rápidamente ... si mueve un rango completo de valores a un valor diferente std::list
, toda la operación es O (1). También es mucho más difícil invalidar referencias en la lista, lo que a veces puede ser importante.
Como regla general, prefiero std::deque
hacerlo std::vector
, a menos que necesite poder pasar los datos a una biblioteca que espera una matriz sin procesar. std::vector
se garantiza contiguo, por lo que &v[0]
funciona para este propósito. No recuerdo la última vez que usé un std::list
, pero fue casi seguro porque necesitaba una garantía más fuerte para que las referencias siguieran siendo válidas.
std::deque
contrastd::vector
? Te sorprenderá ...Las cosas han cambiado
Ahora estamos en Qt 5.8 y las cosas han cambiado, así que la documentación. Da una respuesta clara y diferente a esta pregunta:
fuente
En
QVector
es similar astd::vector
.QLinkedList
es similar astd::list
.QList
es un vector basado en índices, pero la posición de la memoria no está garantizada (comostd::deque
).fuente
Desde el documento QtList:
QList que se utilizará en la mayoría de los casos. Para estructuras con miles de elementos, permite una inserción eficiente en el medio y proporciona acceso indexado.
prepend()
yappend()
muy rápido, ya que la memoria está preasignada en ambos extremos de la matriz interna.QList<T>
es una matriz de puntero de tipo T. Si T tiene un puntero o Qt tipo puntero de tipo compartido, el objeto se almacena directamente en la matrizQVector
preferible en el caso de muchosappend()
oinsert()
de elementos nuevos con un tamaño mayor que un puntero, ya queQVector
asigna memoria para sus elementos en una única asignación de montón. ParaQList
, insertar o agregar un nuevo elemento requiere la asignación de memoria del nuevo elemento en el montón. En resumen, si desea que los elementos ocupen posiciones de memoria adyacentes, o si sus elementos son más grandes que un puntero y desea evitar la sobrecarga de asignarlos en el montón individualmente en el momento de la inserción, utiliceQVector
.fuente
QVector
es como una matriz que puede cambiar de tamaño (aumentar o disminuir) pero conlleva transacciones, cálculos y tiempo pesados.Por ejemplo, si desea agregar un elemento, se crea una nueva matriz, todos los elementos se copian en la nueva matriz, el nuevo elemento se agrega al final y la antigua matriz se elimina. Y viceversa para eliminar también.
Sin embargo,
QLinkedList
funciona con punteros. Entonces, cuando se crea un nuevo elemento, solo se asigna un nuevo espacio de memoria y se vincula a la única parte de la memoria. Dado que funciona con punteros, es más rápido y eficiente.Si tiene una lista de elementos cuyo tamaño no espera cambiar mucho,
QVector
probablemente sea bueno, pero generalmenteQLinkedList
se usa para la mayoría de los propósitos.fuente