Domanda

Ciao! Sto facendo questo progetto e in questo momento sto cercando di:

  1. crea alcuni oggetti e li memorizza in vettori, che vengono memorizzati in un altro vettore V
  2. scorre i vettori all'interno di V
  3. scorre attraverso gli oggetti all'interno dei singoli vettori

Ad ogni modo, stavo solo cercando nel web e mi sono imbattuto nella funzione stl for_each. Sembra piuttosto pulito ma sto avendo problemi con esso. Sto cercando di usarlo in questo modo:

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

iterateThroug .... fa semplicemente lo stesso sul vettore passato ad esso ..

Ora sto ottenendo una strana " Vector iteratori incompatibili " errore di runtime. L'ho visto e non riesco a trovare alcun input utile su questo ..

Non so se sia d'aiuto, ma V è un vettore privato < > memorizzato in classe A, che ha un accedente, e sto cercando di iterarlo in classe B facendo:

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

Qualcuno ha idea di cosa sta succedendo?

EDIT: Ok, quindi penso che sia meglio solo pubblicare il codice e dove potrebbero essere in arrivo problemi ...

getTiles in gameState.h:

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

for_each loop in 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();
}        

creazione dei vettori:

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;
}

e per ogni evenienza potrebbe essere pertinente:

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

Ora è più facile individuare il problema? Lo spero ... E se trovi qualcosa di stupido che potrei fare, per favore fammi sapere, sono un po 'nuovo di C ++ e i puntatori e i riferimenti mi confondono ancora.

EDIT2: Grazie ragazzi, ha funzionato perfettamente ... bene per quel problema, ora sembra che io abbia un problema con la creazione delle tessere e accarezzandole nel vettore riga ... sembra che anche attraverso il vettore sia stato creato e passa correttamente, le tessere che avrebbero dovuto essere in esso non lo sono (si perdono dopo:

    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;
    }

loop. Se qualcuno di voi ha delle buone idee per risolverlo, siete invitati ad aiutarmi;) Nel frattempo, continuerò a provare a risolverlo

È stato utile?

Soluzione

Qual è il prototipo di A::getV()?

Sto solo speculando ma se A->getV().begin() non restituisce un riferimento allora può spiegare il " Gli iteratori vettoriali sono incompatibili " messaggio di errore.

In effetti A->getV().end() e A->getV() sarebbero due iteratori su vettori diversi : ogni vector<vector<tile*> > getTiles(); invocazione restituisce una copia diversa del membro privato.

Spero che questo ti aiuti a eseguire il debug del tuo problema.


MODIFICA: sembra che l'ho anticipata nel modo giusto: dopo aver modificato la tua domanda fornendo i dettagli, vedo che stai definendo

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

Di conseguenza, nella seguente dichiarazione:

getTiles()

Come anticipato sopra, ogni chiamata a begin() restituirà una copia temporanea separata del vettore membro. Di conseguenza, gli iteratori restituiti da end() e for_each provengono da vettori diversi, da cui il messaggio di errore che stai affrontando in fase di esecuzione.

Inoltre, come sottolineato da Charles nella sua risposta dettagliata , questi vettori temporanei verranno distrutti quando viene raggiunto il corpo della funzione di const vector<vector<tile*> >& getTiles() const;.

Valuta di restituire il vettore per riferimento const in questo modo:

drawTiles

E puoi anche cambiare void drawTiles(const vector<tile*>& row) per evitare ancora più copie:

<=>

Altri suggerimenti

Quello che faccio è questo: il modo diretto

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<<" ";
    }  
}

Questa è l'idea approssimativa. Trovo ingombrante il metodo for_each per fare solo un doppio ciclo. for_each è utile quando vuoi davvero fare un calcolo su ciascun elemento (come una sorta di mappatura per ogni elemento)

Hai un paio di errori gravi, ma prima uno minore.

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

Fino a quando non verrà pubblicato lo standard successivo, è necessario uno spazio tra il >.

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

Questa funzione restituisce un vector in base al valore, il che significa che crea una nuova copia di qualunque curState viene passato all'istruzione return nella funzione. (Presumo che questa dichiarazione di funzione sia qualunque sia la classe begin() è un'istanza di.)

Quando lo fai:

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

Ogni chiamata a getTiles restituirà una copia temporanea separata di un vettore. Questo non significa solo che i tuoi iteratori da end() e for_each provengono da vettori di differenza, ma i vettori saranno distrutti quando viene raggiunto il corpo della funzione di std::for_each.

Sembra che tu debba cercare riferimenti e passare per riferimento, perché devi capirli prima di poter usare correttamente <=> in questi scenari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top