Ver Mensaje Individual
  #8 (permalink)  
Antiguo 19/01/2013, 00:37
fightmx
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 9 meses
Puntos: 22
Respuesta: Duda STL Vector

Cita:
mmm mi pregunta esta mas que nada orientada al manejo de memoria para obtener un programa economico y eficaz
Es más eficiente asignar bloques grandes de memoria que bloques pequeños (la cantidad de solicitudes sería mayor para reservar la misma cantidad de memoria). Si tienes una idea aproximada de la cantidad límite de elementos que vas a manejar, entonces el vector es la mejor opción, siempre y cuando te quede claro como está reservando memoria. De forma muy simple el proceso del vector puede ser:

1. Vector sin elementos - No hay reserva de memoria
2. Inserto 1 nuevo elemento al final - Reserva memoria hasta para 1 elemento
3. Inserto 1 nuevo elemento al final - Reserva memoria hasta para 2 elementos - Copia elementos y remueve el bloque anterior de memoria
4. Inserto 1 nuevo elemento al final - Reserva memoria hasta para 4 elementos - Copia elementos y remueve el bloque anterior de memoria
5. Inserto 1 nuevo elemento al final - No es necesario reservar memoria
6. Inserto 1 nuevo elemento al final - Reserva memoria hasta para 8 elementos - Copia elementos y remueve el bloque anterior de memoria
7. Inserto 3 nuevos elementos al final - No es necesario reservar memoria
8. Inserto 1 nuevo elemento al final - Reserva memoria hasta para 16 elementos - Copia elementos y remueve el bloque anterior de memoria
9. Inserto 7 nuevos elementos al final - No es necesario reservar memoria
10. Inserto 1 nuevo elemento al final - Reserva memoria hasta para 32 elementos - Copia elementos y remueve el bloque anterior de memoria
...

Como ya te habían mencionado el vector trata de mantener una cantidad de elementos reservados en memoria (capacity) mayor que la cantidad de elementos que actualmente contiene (size), esto para amortizar el número de reservas y copias de elementos a nuevos bloques de memoria. En éste ejemplo supuse una implementación basada en potencias de 2, aunque el funcionamiento real depende de cada compilador.

Si conoces el número aproximado de elementos totales que vas a manejar entonces puedes ahorrarte todo el proceso, por ejemplo, si sabes que no vas a tener más de 30000 elementos, basta con:

Código C++:
Ver original
  1. myVector.reserve(30000);

La memoria se reserva en una sola vez y no habrá copia de elementos a nuevos bloques de memoria (siempre y cuando insertes al final, resulta eficiente y no malgastas memoria), si por algo el size del vector sobrepasa éste número el procedimiento es como antes (no quiere decir que no puedas almacenar más de 30000 elementos, simplemente que reservas memoria hasta para 30000 elementos antes de que una nueva reserva suceda). Por otro lado; si no tenemos ni idea de la cantidad total de elementos, lo que muy probablemente pasará, es que por la forma (que puede ser exponencial) en que se va reservando la memoria, terminemos con una cantidad reservada muy por encima de lo necesario (lo que afecta depende de cada situación).

Con un list la memoria se administra de manera constante, es decir, insertas un elemento y se reserva memoria para ese nuevo elemento (no importando el size), además no necesita mover bloques de memoria ya que mantiene referencias respecto a los elementos anterior y siguiente, resultando muy efectivo para la inserción intermedia; que por el contrario, en un vector insertar de manera intermedia implica forzosamente una nueva reserva y copia del bloque anterior de memoria (ya que debe mantener sus elementos continuos en memoria), esto último dándole ventaja del acceso aleatorio(indexado), algo de lo que carecen las listas.

Al final tienes que tomar en cuenta varios factores (tipo de inserción, forma de acceso, tipo de dato, constructores, etc.) y evaluar, muchas veces sacrificas memoria por rendimiento o viceversa, a veces puedes tener lo necesario para lograr un buen balance, en fin, depende de cada situación.