2010-06-16 10 views

Respuesta

17

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.

+0

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

+0

@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

+0

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

1

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 comprueba
  • vector::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. 
    */ 
1

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.

Cuestiones relacionadas