2012-08-30 17 views
5

Soy nuevo en C++ y estoy ansioso por ver si esta es la forma preferida de la inserción en un std :: vectorinsertar en un std :: vector en un índice a través del operador de asignación

std::vector<Object_I_madeup> myVector; 

    void setAt(int x, Object_I_madeup o) 
     { 
      myVector[x] = o; 

     } // set the array location at x to be o. 

Lo pregunto porque Veo muchas cosas sobre el uso de push_back, o el altamente confuso insert(). ¿Es esta forma de Java válida? Prefiero hacer eso ...

+2

¿Qué quiere decir por insertar * *? ¿Quiere decir * establecer * el valor en esa posición? ¿O quieres decir * insertar * un elemento en esa ubicación que desplaza al resto de los elementos? Encuentro que su uso de * insert * confusing ... –

Respuesta

10
myVector[x] = o; 

Está bien definido solo si x < myVector.size(). De lo contrario, invoca un comportamiento indefinido, porque en ese caso intenta acceder a un elemento fuera del límite del vector.

Si desea asegurarse de que compruebe fuera de acceso obligado también, a continuación, utilizar at() como:

myVector.at(x) = o; 

Ahora se va a tirar std::out_of_range excepción si x >= myVector.size(). ¡Entonces tienes que poner este código en el bloque try-catch! La diferencia entre ellos se discute con gran detalle aquí.

+0

¿La API 'insert' en el vector también hace que estas comprobaciones de acceso fuera de límite sean como' at' API? La API 'insert' se ve única en el sentido de que toma un parámetro de posición de iterador en lugar de un parámetro de posición int. No sé si realmente puedo crear un iterador w.r.t. una posición de un vector que estará fuera de límites para él. – RBT

1

Solo es válido si el tamaño del vector es al menos x + 1. Si no es así, estás accediendo fuera de límites.

Si se declara el vector de la siguiente manera:

std::vector<Object_I_madeup> myVector(10); // construct the vector with size 10 
              // and default-initialize its elements 

luego podrás acceder de forma segura los índices 0 - 9. su vector en el ejemplo está vacía, sin embargo, todavía no es un índice válido a ella .

+0

En otras palabras, no cambiará el tamaño del vector si el índice no es válido. –

1

Se trabajará en el caso de que no están tratando de acceder a él fuera de sus límites, es decir, el tamaño del vector es mayor que x.

1

Si usted está buscando un equivalente similar a Java del método ArrayList.set(), puede hacerlo a través de más de cerca

void setAt(int x, Object_I_madeup o) 
{ 
    myVector.at(x) = o; 
} 

Al igual que la versión de Java, vector::at() lanzará una excepción si el vector no es lo suficientemente grande. Tenga en cuenta que esto hace una copia del objeto (en realidad, dos, ya que también está pasando por valor a la función).

2

myVector[x] = o hace algo completamente diferente de usar myVector.push_back(o) (o usando insert). Por lo tanto cuál es el método correcto depende de lo que está tratando de hacer:

  • myVector[x] = o no se inserta en el vector, pero reemplaza el elemento en la posición x con o. Por lo tanto, la longitud del vector no cambia y el valor que estaba previamente en la posición x ya no está en el vector. Si la longitud de myVector no era más grande que x esto dará como resultado un acceso fuera de límites, lo que lleva a un comportamiento indefinido
  • myVector.push_back(o) insertará o al final de myVector.Por lo tanto, después de esta operación, la longitud del vector se incrementará en uno y el último elemento de myVector será o. No se han eliminado los valores de myVector.
  • myVector.insert(i, o) insertará o en una posición arbitraria, especificada por el iterador i. Por tanto, la longitud del vector se incrementará en uno y el "ith" elemento (elemento número myVector.begin() - i) será o
Cuestiones relacionadas