Question

Hé là! Je fais ce projet et maintenant j'essaie de:

  1. créer des objets et les stocker dans des vecteurs, qui sont stockés dans un autre vecteur V
  2. parcourir les vecteurs à l'intérieur de V
  3. parcourir les objets à l'intérieur des vecteurs individuels

Quoi qu'il en soit, je cherchais simplement sur le Web et je suis tombé sur la fonction stl for_each. Cela semble assez chouette mais ça me pose problème. J'essaie de l'utiliser de cette façon:

for_each(V.begin(), V.end(), iterateThroughSmallVectors);

le iterateThroug .... fait simplement la même chose sur le vecteur qui lui est passé ..

Maintenant, je reçois un étrange " vecteur itérateur incompatible & "; erreur d'exécution. Je l'ai regardé et je ne trouve aucune contribution utile à ce sujet.

Je ne sais pas si cela aide, mais V est un vecteur privé < > stocké dans la classe A, qui a un accesseur, et j'essaye de le parcourir en classe B en faisant:

A->getV().begin(), A->getV().end(), etc..

Quelqu'un a-t-il une idée de ce qui se passe?

EDIT: Ok, donc je pense qu'il est préférable de simplement poster le code, et où des problèmes pourraient se poser ...

getTiles in gameState.h:

vector<vector<tile*>> getTiles();

boucles for_each dans main.cpp:

for_each(currState->getTiles().begin(),currState->getTiles().end(), drawTiles);
.
.
void drawTiles(vector<tile*> row)
{
for_each(row.begin(), row.end(), dTile);
}
void dTile(tile *t)
{
t->draw();
}        

créant les vecteurs:

int tp = -1;
int bCounter = 0;
int wCounter = 0;
for (int i = 0; i < 8; i++)
{
vector<tile*> row(8);
    for (int j = 0; j < 8; j++)
    {
    tile *t = new tile(tp, (i+(SIDELENGTH/2))*SIDELENGTH,
        (j+(SIDELENGTH/2))*SIDELENGTH);
    row.push_back(t);
            tp *= -1;
    }
currState->setTiles(row);
    tp *= -1;
}

et juste au cas où cela pourrait être pertinent:

void gameState::setTiles(vector<tile*> val)
{
    tiles.push_back(val);
}

Est-il plus facile de détecter le problème maintenant? J'espère bien ... Et si vous voyez des choses stupides que je pourrais faire, dites-le-moi, je suis un peu nouveau dans le domaine du C ++ et les pointeurs et références me confondent toujours.

EDIT2: Merci les gars, cela a fonctionné parfaitement ... bien pour ce problème, maintenant, il semble que j'ai un problème avec la création des tuiles et de les tracer dans le vecteur de lignes .. il semble que même à travers le vecteur soit créé et passe correctement, les tuiles qui étaient supposées y être ne le sont pas (elles sont perdues après le:

    for (int j = 0; j < 8; j++)
    {
    tile *t = new tile(tp, (i+(SIDELENGTH/2))*SIDELENGTH,
        (j+(SIDELENGTH/2))*SIDELENGTH);
    row.push_back(t);
            tp *= -1;
    }

boucle. Si certains d'entre vous ont de bonnes idées pour résoudre ce problème, n'hésitez pas à m'aider;) En attendant, je continuerai d'essayer de résoudre ce problème

Était-ce utile?

La solution

Quel est le prototype de A::getV()?

Je ne fais que spéculer, mais si A->getV().begin() ne renvoie pas de référence, il peut expliquer que les & "itérateurs de vecteur sont incompatibles &"; message d'erreur.

En effet A->getV().end() et A->getV() seraient deux itérateurs sur des vecteurs différents : chaque vector<vector<tile*> > getTiles(); invocation renvoyant une copie différente du membre privé.

J'espère que cela vous aidera à résoudre votre problème.

EDIT: il semble que je l’ait bien prévu: après avoir édité votre question avec des détails, je vois que vous définissez

for_each(currState->getTiles().begin(),currState->getTiles().end(), drawTiles);

En conséquence, dans la déclaration suivante:

getTiles()

Comme prévu ci-dessus, chaque appel à begin() renverra une copie temporaire distincte du vecteur membre. En conséquence, les itérateurs renvoyés par end() et for_each proviennent de vecteurs différents, d’où le message d’erreur auquel vous êtes confronté au moment de l’exécution.

Aussi, comme indiqué par Charles dans sa réponse détaillée , ces vecteurs temporaires seront détruits au moment où le corps de fonction de const vector<vector<tile*> >& getTiles() const; est atteint.

Pensez à renvoyer le vecteur par référence const comme suit:

drawTiles

Et vous pouvez aussi changer void drawTiles(const vector<tile*>& row) pour éviter encore plus de copies:

<=>

Autres conseils

Ce que je fais est ceci: la manière directe

vector<vector<int> > vvi;
vector<vector<int> >::iterator vvi_iterator;
vector<int>::iterator vi_iterator;

for(vvi_terator = vvi.begin();vvi_iterator!=vvi.end();++vvi_iterator) {
    for(vi_iterator = (*vvi_iterator).begin();vi_iterator!=(*vvi_iterator).end();++vi _iterator) {
     cout<<*vi_iterator<<" ";
    }  
}

C’est une idée approximative. Je trouve la méthode for_each fastidieuse de ne faire qu'une double boucle. for_each est utile lorsque vous voulez vraiment faire un calcul sur chaque élément (comme une sorte de mapping pour chaque élément)

Vous avez quelques erreurs graves, mais d’abord une erreur mineure.

vector<vector<tile*>> getTiles();

Jusqu'à la publication du prochain standard, vous avez besoin d'un espace entre <>>.

vector< vector<tile*> > getTiles();

Cette fonction retourne un > par valeur, ce qui signifie qu’elle crée une nouvelle copie de tout vector qui est passé à l’instruction return de la fonction. (Je suppose que cette déclaration de fonction correspond à la classe curState qui est une instance de.)

Quand vous faites ensuite:

for_each(currState->getTiles().begin(),currState->getTiles().end(), drawTiles);

Chaque appel à getTiles renverra une copie temporaire distincte d'un vecteur. Cela signifie non seulement que vos itérateurs de begin() et end() proviennent de vecteurs de différence, mais que les vecteurs seront détruits au moment où le corps de fonction de for_each est atteint.

Il semble que vous ayez besoin de rechercher des références et de passer par référence, car vous devez les comprendre avant de pouvoir utiliser std::for_each correctement dans ces scénarios.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top