Estoy buscando un tipo de datos C++ similar a std::vector
pero sin los gastos generales relacionados con el cambio de tamaño dinámico. El tamaño del contenedor permanecerá constante a lo largo de su vida útil. Consideré usar boost::array
, sin embargo, eso no es apropiado porque requiere que el tamaño de la matriz sea conocido en tiempo de compilación, que no es el caso en mi situación.vector con tamaño constante
Respuesta
Mida si el cambio de tamaño dinámico realmente tiene algún impacto en el rendimiento antes de usar algo no estándar.
Consejo: Con vector.reserve, nunca habrá ninguna reasignación de matriz.
La sobrecarga inducida por la capacidad de cambio de tamaño dinámico de std::vector
es prácticamente inexistente.
Si necesita una matriz de tamaño de tiempo de compilación, en muchos casos sería una buena idea buscar algo más eficiente que std::vector
.
Pero la diferencia entre el tamaño de tiempo de ejecución fijo y el tamaño de tiempo de ejecución dinámico es despreciable. std::vector
es una solución perfecta en este caso.
He utilizado una clase de plantilla basada en ideas de STLSoft's auto_buffer
(he improvisado mi propia implementación del libro Imperfect C++ de Matthew Wilson junto con algunas ideas de la implementación de STLSoft). Asigna la matriz por defecto en la pila (o incrustado en el objeto de la clase) si es lo suficientemente pequeña (en función de un parámetro de plantilla que proporcione). Si la asignación de tiempo de ejecución es mayor que eso, el almacenamiento de la matriz proviene del montón.
http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html
Así que lo bueno de esta clase es que para tamaños pequeños más pequeños, la asignación es esencialmente un no-op.
No hay gastos generales en la reasignación si no reasigna std :: vector. Así que o bien:
- construir el std :: vector con un tamaño conocido por delante (
std::vector x(100)
) - reserva de llamada (n) después de la construcción para asegurarse de que al menos n elementos pueden ser empujados en el vector antes de que ocurra la reasignación .
Si no se conoce el tamaño de la matriz en tiempo de compilación, la única opción en C++ es una matriz asignada dinámicamente. Puede usar un std::vector
para garantizar RAII. Como han dicho otros, el hecho de que std::vector
s se pueda cambiar de tamaño no significa que tenga que cambiar su tamaño. Cree el std::vector
con el tamaño correcto y luego no llame a nada que pueda redimensionarlo.
- 1. Vector de tamaño constante
- 2. ¿Cómo mantener el tamaño de JTextArea constante?
- 3. ¿Cómo iterar sobre un vector constante?
- 4. Tamaño de vector de STL
- 5. Declarar el tamaño de la matriz con una variable no constante
- 6. tamaño de arreglo (bloqueo) de std :: vector
- 7. Cómo reducir el tamaño de std :: vector?
- 8. Vector claro frente a cambiar el tamaño
- 9. cambiar el tamaño de vector multidimensional
- 10. C# genérico con constante
- 11. C++ ampliar un vector con otro vector
- 12. Obteniendo constante constante de recuperación de tiempo constante con listas inmutables en un contexto de programación funcional
- 13. matriz de tamaño definido por la variable no constante
- 14. vector comprimido/clase de matriz con acceso aleatorio a datos
- 15. Inicializando ArrayList con literal constante
- 16. Implementación de un vector de tamaño fijo, inmutable y especializado
- 17. OpenCV se escapa con la asignación a una referencia constante?
- 18. Declaración de una matriz con una variable de tamaño no constante
- 19. de error: se esperaba expresión constante
- 20. ¿Cambiar el tamaño de un vector invalida los iteradores?
- 21. ¿Cómo hacer std :: vector de otro vector con filtro específico?
- 22. Obtener un vector constante de la lista de nombres de elementos
- 23. sizeof() un vector
- 24. El vector de inicialización especificado (IV) no coincide con el tamaño de bloque para este algoritmo
- 25. vector AS3 con init valora
- 26. Mover con el vector :: push_back
- 27. C++ vector con la herencia
- 28. Rendimiento del vector :: tamaño(): ¿es tan rápido como leer una variable?
- 29. Especialización en plantillas C++ con valor constante
- 30. Problemas con const resolución/no constante sobrecarga
+1 por golpearme al buffer automático. :) Boost tiene uno [para revisión] (http://www.boost.org/community/review_schedule.html). – GManNickG
@Zenikoder: 'auto_buffer <>' no es parte de la STL. –