Pregunta

Hola!Yo estoy haciendo este proyecto y ahora estoy tratando de:

  1. crear algunos de los objetos y almacenarlos en vectores, que se almacenan en otro vector V
  2. iterar a través de los vectores en el interior de V
  3. iterar a través de los objetos dentro de los vectores individuales

De todos modos, yo estaba buscando en la web y me he topado con la stl función de for_each.Parece bastante interesante, pero estoy teniendo problemas con él.Estoy tratando de utilizar de esta manera:

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

el iterateThroug....simplemente hace lo mismo en el vector pasado..

Ahora me estoy poniendo un extraño "Vector de iteradores incompatibles" error de tiempo de ejecución.He mirado en él y no puede encontrar ninguna información útil en este..

No sé si ayuda, pero V es un vector privado<> se almacenan en la clase a, que tiene un descriptor de acceso a ella, y estoy tratando de iterar a través de ella en la clase B, haciendo:

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

Alguien tiene alguna idea de lo que está pasando?

EDITAR:Ok, así que creo que es mejor publicar el código, y donde los problemas pueden ser arrising...

getTiles en gameState.h:

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

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

la creación de los vectores:

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

y sólo en caso de que podrían ser relevantes:

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

Es más fácil detectar el problema ahora?Eso espero...Y si haces detectar cualquier estúpido cosas que podría estar haciendo, por favor hágamelo saber, soy un poco nuevo en C++ y de los punteros y referencias todavía me confundan.

EDIT2:Gracias chicos, que funcionó a la perfección...bien por ese problema, ahora parece que tengo un problema con la creación de las baldosas y stroing en el vector fila..parece que incluso a través del vector se crea y se pasa correctamente, los azulejos que se supone que en ti no (se pierden después de la :

    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.Si alguno de vosotros tiene buenas ideas acerca de cómo resolver este eres bienvenido para que me ayuden ;) por el momento, voy a seguir intentando solucionarlo

¿Fue útil?

Solución

¿Cuál es el prototipo de A::getV()?

Sólo estoy especulando, pero si A::getV() no se devolverá una referencia, a continuación, se puede explicar el "Vector de iteradores son incompatibles" mensaje de error.

De hecho A->getV().begin() y A->getV().end() serían dos de los iteradores a través de diferentes vectores:cada A->getV() la invocación de la devolución de un ejemplar diferente de la de miembro privado.

Espero que esto le ayudará a depurar el problema.


EDITAR:parece que me anticipaba a la derecha:después de editar tu pregunta aportando detalles, puedo ver que estamos definiendo

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

Como consecuencia de ello, en la siguiente declaración:

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

Como se anticipó anteriormente, cada llamada a getTiles() volverá separado una copia temporal de los estados de vectores.Como consecuencia, los iteradores regresó de begin() y end() vienen de diferentes vectores, por lo tanto el mensaje de error que estamos enfrentando en tiempo de ejecución.

También, como se señalaba en Charles en su respuesta detallada, estos temporal de los vectores serán destruidos por el tiempo que el cuerpo de la función de for_each se alcanza.

Considere la posibilidad de devolver el vector mediante la constante de referencia como este:

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

Y usted puede también cambiar drawTiles para evitar aún más copias:

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

Otros consejos

Lo que hago es esto: la forma directa

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

Esta es la idea aproximada. Encuentro el método for_each engorroso por solo hacer un doble bucle. for_each es útil cuando realmente quieres hacer un cálculo en cada elemento (como algún tipo de mapeo para cada elemento)

Usted tiene un par de errores graves, pero primero menor.

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

Hasta el próximo estándar sale usted necesita un espacio entre la a >.

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

Esta función devuelve un vector por valor, lo que significa que se crea una nueva copia de lo que sea vector se pasa a la instrucción return en la función.(Supongo que esta declaración de la función es el todo de la clase curState es una instancia de.)

Cuando, a continuación, hacer:

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

Cada llamada a getTiles volverá separado una copia temporal de un vector.Esto no sólo significa que su iteradores de begin() y end() provienen de la diferencia de los vectores, pero los vectores serán destruidos por el tiempo, el cuerpo de la función de for_each se alcanza.

Parece que usted necesita para la investigación de referencias y se pasan por referencia, ya que es necesario para entender esto antes de que usted puede utilizar correctamente std::for_each en estos escenarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top