Pregunta

¿Cómo puedo sacar mis variables de un vector?

No puedo usar los operadores de inserción binaria o los operadores iguales.

Anteriormente, declaré un vector < someStruct > * vObj y lo asignó, luego devolvió el vObj y lo llamó en esta función:

vector<sameStruct> firstFunc();

for (unsigned int x = 0; x < v->size(); x++)
{
   v[x];
}

cuando lo depuro, v [x] ahora tiene el contenido completo del vector original, como lo hacía antes sin el subíndice / índice.

Pero no creo que haya hecho nada para avanzar más allá de eso.

Solo tengo alrededor de 4 variables dentro de mi vector; cuando lo depuro, tiene la información que necesito, pero no puedo acceder a ella.

¿Fue útil?

Solución

Como está escrito v es un puntero a un vector de estructuras.

Cuando indexas directamente en v, todo lo que estás haciendo es puntero aritmático. v [x] es el vector de las estructuras en la posición x (asumiendo que v es una matriz si es solo un objeto al final del puntero, entonces v [x] para x > 0 es simplemente basura). Esto se debe a que está aplicando la [x] no al vector al que apunta v, sino al puntero v en sí.

Debe desreferenciar el puntero y luego indexar en el vector usando algo como:

(*v)[x];

En este punto, tiene una referencia al objeto en la posición x del vector para obtener sus funciones / variables miembro:

(*v)[x].variable;

o

(*v)[x].memberfunction(parameters);

Si no desea desreferenciar el vector y luego acceder al elemento dentro de él, puede intentar algo como:

v->at(x);
v->at(x).variable;
v->at(x).memberfunction;

De esta manera, está accediendo a una función miembro de un objeto exactamente de la misma manera que cuando llamó:

v->size();

Espero que esto ayude.

Otros consejos

Para usar el operador [] para acceder a los elementos, debe hacerlo en un objeto, no un puntero a un objeto.

Probar;

(*vec)[x];

Por ejemplo,

for (int i = 0; i < vec->size(); i++)
{
  printf("Value at %d is %d\n", i, (*vec)[i]);
}

Tenga en cuenta que al llamar a funciones en un puntero, generalmente utiliza el operador - > en lugar del operador . , pero puede hacerlo fácilmente (* vec) .some_func (); en su lugar.

Los operadores como [], -, ++ y así sucesivamente pueden actuar sobre objetos y punteros. Con los objetos actúan como llamadas de función, pero en los punteros actúan como operaciones matemáticas en la dirección.

Por ejemplo;

pointer[nth];
*(pointer + nth);

Tiene exactamente el mismo efecto: devuelven el enésimo objeto desde el inicio del puntero. (note la ubicación del * en el segundo ejemplo, se llama después de se aplica el desplazamiento.

Otros dos consejos;

También puede evitar la necesidad de desreferenciar esto pasando el vector como referencia, no como puntero. No siempre es una opción adecuada, pero conduce a un código más limpio.

void my_func(std::vector<int>& vector)
{
  // vector can then be used as a regular variable
}

Si vas a pasar muchos vectores de un tipo específico a las funciones, entonces puedes usar typedef para mayor claridad y para ahorrar en la escritura.

typedef std::vector<int> IntVector;

void my_func(IntVector& vector)
{
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top