Question

Comment puis-je obtenir mes variables d'un vecteur?

Je ne peux pas utiliser les opérateurs d'insertion binaire ni les opérateurs égaux.

Auparavant, j’avais déclaré un vecteur < someStruct > * vObj et l'a alloué, puis a renvoyé le vObj et l'a appelé dans cette fonction:

vector<sameStruct> firstFunc();

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

lors du débogage, v [x] contient maintenant tout le contenu du vecteur d'origine, comme il le faisait auparavant sans indice / indice.

Mais je ne pense pas avoir rien fait pour progresser au-delà de cela.

J'ai juste environ 4 variables dans mon vecteur; lorsque je le débogue, il contient les informations dont j'ai besoin, mais je ne peux pas y accéder.

Était-ce utile?

La solution

Comme il est écrit v est un pointeur sur un vecteur de struct.

Lorsque vous indexez directement dans v, vous ne faites que du pointeur arithmatique. v [x] est le vecteur des structures à la position x (en supposant que v est un tableau s'il ne s'agit que d'un seul objet à la fin du pointeur, v [x] pour x > 0 est simplement un déchet). En effet, il applique le [x] non pas au vecteur indiqué par v mais au pointeur v lui-même.

Vous devez déréférencer le pointeur puis indexer dans le vecteur à l'aide de quelque chose comme:

(*v)[x];

À ce stade, vous avez une référence à l'objet situé à la xième position du vecteur pour obtenir ses fonctions membres / variables à utiliser:

(*v)[x].variable;

ou

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

Si vous ne voulez pas déréférencer le vecteur, puis accéder à l'élément qu'il contient, vous pouvez essayer quelque chose comme:

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

De cette façon, vous accédez à une fonction membre d'un objet de la même manière que lorsque vous avez appelé:

v->size();

J'espère que cela vous aidera.

Autres conseils

Pour utiliser l'opérateur [] pour accéder aux éléments, vous devez le faire sur un objet et non sur un pointeur sur un objet.

Essayez;

(*vec)[x];

ex.

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

Notez que lorsque vous appelez des fonctions sur un pointeur, vous utilisez généralement l'opérateur - > à la place de l'opérateur . , mais vous pouvez facilement le faire (* vec) .some_func (); à la place.

Les opérateurs tels que [], -, ++, etc. peuvent agir à la fois sur les objets et sur les pointeurs. Avec les objets, ils agissent comme des appels de fonction, mais sur les pointeurs, ils agissent comme des opérations mathématiques sur l’adresse.

Par exemple;

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

ont exactement le même effet: ils renvoient le nième objet à partir du début du pointeur. (notez l'emplacement du * dans le deuxième exemple, il est appelé après que le décalage a été appliqué.

Deux autres astuces;

Vous pouvez également éviter de déréférencer de la sorte en donnant le vecteur comme référence et non comme un pointeur. Ce n'est pas toujours une option appropriée, mais cela conduit à un code plus propre.

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

Si vous transmettez beaucoup de vecteurs d'un type spécifique à des fonctions, vous pouvez utiliser un typedef à la fois pour des raisons de clarté et pour économiser sur la saisie.

typedef std::vector<int> IntVector;

void my_func(IntVector& vector)
{
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top