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::vectorclase de la biblioteca estándar.
std::list, aunque perderá la indexabilidad (no operator[]), por lo que no es realmente una matriz. listque tiene sus propias idiosincrasias, por lo que a vectormenudo 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 vectorvs dequevs, listya que son en gran medida intercambiables en el código; solo use un typedef para su contenedor, por ejemplo typedef vector<MyObj> MyList.
ArrayListcomo 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, vectoraún podría ser más rápido que listsiempre 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 vectoraquí.
A diferencia de ArrayListy Arrayen Java, no es necesario hacer nada especial para tratar a vectorcomo una matriz: se garantiza que el almacenamiento subyacente en C ++ es contiguo y se puede indexar de manera eficiente.
A diferencia de ArrayList, a vectorpuede 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 vectorque 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 ++.