¿Cómo puedo acceder a las variables en vector < struct > * obj?
-
05-07-2019 - |
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.
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)
{
}