¿Qué tan riguroso es el control de límites en los vectores en comparación con las matrices de montón? ¿Cómo está comprobando los límites y cómo se compara con la forma en que se comprueba una matriz de montón?¿Son los vectores más rigurosos al marcar fuera de los límites que las matrices de montón?
Respuesta
Un vector
hará lo comprobación de límites si se utiliza la función at()
, por ejemplo:
std::vector<int> v(5);
v.at(3) = 10;
v.at(5) = 20; // throws an exception, std::out_of_range
Sin embargo, si se utiliza operator[]
, no hay comprobación de límites. (Y el acceso a elementos inexistentes conduce a un comportamiento indefinido.)
Cabe señalar, sin embargo, que la mayoría de las implementaciones tendrán la posibilidad de incluir la comprobación de límites en todos los iteradores, que se discute en las respuestas here. De forma predeterminada, VS2008 y siguientes tienen activado Debug and Release, VS2010 solo lo hace en Debug. gcc requiere que defina _GLIBCXX_DEBUG
para obtener los iteradores marcados.
entonces .at() lo llama explícitamente para hacer una comprobación y [] lo deja en manos de la implementación del compilador? Por alguna razón, estaba usando [] y todavía parecía más surcado que en arreglos regulares. Bien, gracias por la respuesta. – Faken
@Fraken: Sí, 'operator []' solo necesita devolver un elemento existente. Si no puede, lo que sucede deja su programa en un estado indefinido. (Podría colapsar, devolver basura, dejar que un depurador de implementación se active, activar una afirmación, etc.) La única manera de garantizar que obtenga cheques es con 'at()'. – GManNickG
Creo que el operador [] afirmará que el valor está dentro del rango, por lo que puede ver más comportamiento al compilar en modo de depuración. – Cogwheel
Que va a ser la implementación definida, el vector contract no ofrece garantías de comprobación consolidadas. Pero, usted sabe una cosa con certeza, será no peor que una matriz de montón.
En mi aplicación SGI:
vector::operator[]
no se compruebavector::at()
está obligado comprobado
A partir de la definición del archivo de cabecera de operator[]
:
/**
* @brief Subscript access to the data contained in the %vector.
* @param n The index of the element for which data should be
* accessed.
* @return Read-only (constant) reference to data.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().)
*/
Y para vector::at()
:
/**
* @brief Provides access to the data contained in the %vector.
* @param n The index of the element for which data should be
* accessed.
* @return Read/write reference to data.
* @throw std::out_of_range If @a n is an invalid index.
*
* This function provides for safer data access. The parameter
* is first checked that it is in the range of the vector. The
* function throws out_of_range if the check fails.
*/
En una implementación típica, las matrices no se comprueban en absoluto, independientemente de la asignación. std::vector
requiere comprobación de límites en at()
. El acceso fuera de límites con operator[]
proporciona un comportamiento indefinido, por lo que también es posible establecer límites al verificarlo, pero esto es bastante inusual.
Lo que es más importante, sin embargo, aconsejaría generalmente usar algoritmos que en su mayoría eliminen la preocupación en primer lugar. Cuando haces algo como: for (i=0; i<N; i++)
, es bastante fácil para N ser lo incorrecto. Cuando usa algorithm(x.begin(), x.end(), ...);
, es mucho más fácil obtener un grado razonable de certeza de que su lógica es correcta.
- 1. Dibujo fuera de los límites de UITableViewCell
- 2. ¿Cuáles son los límites de ruby en los rieles?
- 3. Java Arrays Index fuera de los límites
- 4. ArrayList índice fuera de los límites
- 5. ¿Cuáles son los límites de TDD?
- 6. SQLite: ¿cuáles son los límites prácticos?
- 7. usando EmbeddedChartBuilder y 'conseguir columnas están fuera de los límites'
- 8. ¿Los límites mínimos/mínimos son mínimos?
- 9. ¿Los dobles son más rápidos que los flotadores en C#?
- 10. ¿Por qué los vectores son tan superficiales?
- 11. Overlay de Android fuera/entre los límites del diseño
- 12. ¿Por qué son distintos los tipos de cadenas y vectores?
- 13. ¿Qué son los objetos de matrices vértice?
- 14. dibujar fuera de los límites de UIView desde drawRect
- 15. Cuando los bloques son más útiles que las funciones (ruby)?
- 16. ¿Por qué los arrays de arrays (vectores) son tan lentos?
- 17. interacción más allá de los límites de uiview
- 18. imagen va más allá de los límites de contenedores div
- 19. ¿Las cargas alineadas con palabras son más rápidas que las cargas desalineadas en los procesadores x64?
- 20. UIView. ¿Cuáles son las dimensiones máximas de los límites que puedo usar?
- 21. Los valores de matrices no son idénticos (¿pero lo son?)
- 22. ¿Cómo evitar que JList haga una selección fuera de los límites de la celda?
- 23. Límites de los solucionadores SMT
- 24. ¿Se supone siempre que los límites superiores de los rangos indexados son exclusivos?
- 25. ¿evita que ggplot2 caiga puntos de datos fuera de los límites del eje?
- 26. ¿Cuáles son los límites técnicos de phoneGap/Cordova?
- 27. ¿Cuáles son los límites o las definiciones de alcance del desarrollo de HTML5?
- 28. ¿Cuáles son los límites de compilar dardos para javascript?
- 29. Almacenamiento interno de Android: ¿cuáles son los límites?
- 30. ¿Cómo son las matrices y los hash los mapas de tiempo constante en su acceso?
¿Está utilizando '[]' o 'at()'? – dmckee