Frage

Hey there! Ich bin dieses Projekt zu tun und jetzt versuche ich zu:

  1. einige Objekte erstellen und speichern sie in Vektoren, die in einem anderen Vektor V gespeichert zu bekommen
  2. iterieren durch die Vektoren V innerhalb
  3. iterieren durch die Objekte innerhalb der einzelnen Vektoren

Wie auch immer, ich war auf der Suche nur die Bahn, und ich kam auf der anderen stl for_each Funktion. Es scheint recht ordentlich, aber ich habe Probleme mit ihm. Ich versuche, es auf diese Weise zu verwenden:

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

die iterateThroug .... einfach macht das gleiche auf dem Vektor an sie übergeben ..

Jetzt bin immer ich ein seltsamer Laufzeitfehler „Vector unvereinbar Iteratoren“. Ich habe auf mich geschaut und kann keinen nützlichen Beitrag zu diesem Thema finden ..

Ich weiß nicht, ob es hilft, aber V ist ein privater Vektor <> in der Klasse A gespeichert, die einen Accessor zu ihm hat, und ich versuche, durch sie in der Klasse B zu durchlaufen, indem Sie:

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

Jeder bekam eine Ahnung von dem, was ist hier los?

EDIT: Ok, also denke ich, ist es besser, nur den Code zu veröffentlichen, und wo Probleme sein könnten arrising ...

getTiles in gameState.h:

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

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

Erstellen der Vektoren:

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

und für den Fall, könnte es sein, relevant:

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

Ist es einfacher, jetzt, das Problem zu erkennen? Ich hoffe, so ... Und wenn Sie irgendeine dumme Sachen beschmutzen ich mich, lass es einfach tun könnte, ich bin ein bisschen neu in C ++ und die Zeiger und Referenzen mich noch verwirren.

EDIT2: Danke Jungs, die perfekt gearbeitet ... gut für dieses Problem, jetzt scheint es, ich ein Problem mit der Schaffung der Fliesen haben und sie in der Zeilenvektor stroing .. es scheint, dass auch durch den Vektor erzeugt wird und geht richtig, die Fliesen, die in ihm sollten sein sind nicht (sie sind nach dem verloren:

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

Schleife. Wenn einer von euch gute Ideen hat dies über die Lösung Sie sind willkommen, mir zu helfen;) In der Zwischenzeit, ich werde immer wieder versuchen, es zu beheben

War es hilfreich?

Lösung

Was ist der Prototyp für A::getV()?

ich nur spekulieren, aber wenn A::getV() keinen Verweis zurückgibt, dann kann es die „Vector Iteratoren sind nicht kompatibel“ Fehlermeldung erklären.

Tatsächlich A->getV().begin() und A->getV().end() würde zwei Iteratoren sein über verschiedene Vektoren :. Jeder A->getV() Aufruf eine andere Kopie des privaten Mitglied Rückkehr

Hope dies wird Ihnen helfen debuggen Ihr Problem.


EDIT: es sieht aus wie ich es richtig erwartet: Nach Ihrer Frage Bearbeitung Einzelheiten zu nennen, kann ich sehen, Sie definieren

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

Als Folge in der folgenden Aussage:

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

Wie oben erwartet, jeder Aufruf getTiles() eine separate temporäre Kopie des Elements Vektor zurück. Als Folge kehrten die Iteratoren von begin() und end() aus verschiedenen Vektoren kommen, damit die Fehlermeldung Sie zur Laufzeit gegenüber.

Auch, wie von Charles in seiner ausführlichen Antwort darauf , werden diese temporären Vektoren durch die Zeit der Funktionskörper von for_each erreicht zerstört werden.

Betrachten Sie den Vektor, der durch konstante Referenz wie diese Rückkehr:

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

Und Sie können auch drawTiles ändern noch mehr Kopien zu vermeiden:

void drawTiles(const vector<tile*>& row)

Andere Tipps

Was ich tue, ist dies: der direkte Weg

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

Dies ist die grobe Idee. Ich finde die for_each Verfahren umständlich für nur eine Doppelschleife zu tun. for_each ist nützlich, wenn Sie wirklich wollen, für jedes Element eine Berechnung tun (wie eine Art Mapping für jedes Element)

Sie haben ein paar schwerwiegende Fehler, aber zuerst eine geringfügige.

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

Bis zum nächsten Standard kommt aus benötigen Sie einen Raum zwischen der >.

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

Diese Funktion gibt einen vector von Wert, was bedeutet, dass es eine neue Kopie von was auch immer vector schafft auf die Return-Anweisung in der Funktion übergeben wird. (Ich gehe davon aus, dass diese Funktion Erklärung ist die, was Klasse curState ist eine Instanz.)

Wenn Sie dann tun:

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

Jeder Aufruf von getTiles wird eine separate temporäre Kopie eines Vektors zurück. Nicht nur, dass dies bedeutet, dass Ihre Iteratoren von begin() und end() kommen aus Differenzvektoren, aber die Vektoren werden durch die Zeit zerstört werden die Funktionskörper von for_each erreicht ist.

Es sieht aus wie Sie Referenzen Forschung müssen und übergeben Bezug genommen wird, weil Sie diese verstehen müssen, bevor Sie richtig std::for_each in diesen Szenarien verwenden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top