Simplemente volviendo a usar C ++ y tratando de convertir un programa Java simple que escribí recientemente.
¿Cuál es el equivalente preferido de Java ArrayList en C ++?
Simplemente volviendo a usar C ++ y tratando de convertir un programa Java simple que escribí recientemente.
¿Cuál es el equivalente preferido de Java ArrayList en C ++?
Respuestas:
Utilice la std::vector
clase de la biblioteca estándar.
std::list
, aunque perderá la indexabilidad (no operator[]
), por lo que no es realmente una matriz. list
que tiene sus propias idiosincrasias, por lo que a vector
menudo es una mejor opción. En los contenedores estándar de C ++, tendrá que comprometerse de una forma u otra. Mire deque
, eso puede ofrecer un mejor rendimiento para usted. Es (relativamente) fácil de medir vector
vs deque
vs, list
ya que son en gran medida intercambiables en el código; solo use un typedef para su contenedor, por ejemplo typedef vector<MyObj> MyList
.
ArrayList
como puede adivinar por el nombre, tampoco está implementado como una lista vinculada. Puede que estés pensando en LinkedList
. Además, incluso si tiene una rotación bastante alta de objetos agregados y eliminados de la lista, vector
aún podría ser más rápido que list
siempre que asigne suficiente espacio inicialmente para que no necesite reasignar (es decir, darle el espacio máximo que debería necesitar).
Un par de puntos adicionales se reutilizan vector
aquí.
A diferencia de ArrayList
y Array
en Java, no es necesario hacer nada especial para tratar a vector
como una matriz: se garantiza que el almacenamiento subyacente en C ++ es contiguo y se puede indexar de manera eficiente.
A diferencia de ArrayList
, a vector
puede contener de manera eficiente tipos primitivos sin encapsulación como un objeto completo.
Al retirar elementos de un vector
, tenga en cuenta que los elementos que están encima del elemento eliminado deben moverse hacia abajo para preservar el almacenamiento contiguo. Esto puede resultar caro para contenedores grandes.
Si almacena objetos complejos en el, asegúrese de vector
que su constructor de copia y sus operadores de asignación sean eficientes. Bajo las sábanas, C ++ STL los usa durante la limpieza del contenedor.
Consejos sobre reserve()
almacenamiento inicial (es decir, en la construcción del vector o en el momento de la inicialización) para minimizar la reasignación de memoria en la extensión posterior que se transfiere de Java a C ++.