Pergunta

Hey there! Estou fazendo esse projeto e agora eu estou tentando:

  1. criar alguns dos objetos e armazená-los em vetores, que ficam armazenados em outro vector V
  2. percorrer os vectores dentro de V
  3. iterate através dos objetos dentro dos vetores individuais

De qualquer forma, eu estava apenas pesquisando na web e eu deparei com a função STL for_each. Parece muito arrumado, mas eu estou tendo problemas com ele. Eu estou tentando usá-lo desta maneira:

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

o iterateThroug .... simplesmente faz o mesmo no vector passado para ele ..

Agora eu estou ficando um estranho "Vector iteradores incompatível" erro de execução. Eu olhei sobre ele e não consigo encontrar qualquer contributo útil sobre isso ..

Não sei se isso ajuda, mas V é um vetor privada <> armazenado na classe A, que tem um sistema de acesso a ele, e eu estou tentando fazer uma iteração através dele na classe B fazendo:

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

Alguém tem alguma idéia do que está acontecendo?

EDIT: Ok, então eu acho que é melhor apenas postar o código, e onde os problemas podem ser arrising ...

getTiles em gameState.h:

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

laços for_each em 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();
}        

criar os vetores:

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 apenas no caso que pode ser relevante:

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

É mais fácil de detectar o problema agora? Espero que sim ... E se você detectar qualquer coisa estúpida que eu poderia estar fazendo, por favor me avise, que eu sou uma espécie de novo para C ++ e os ponteiros e referências ainda me confundem.

EDIT2: Obrigado rapazes, que funcionou perfeitamente ... bem para esse problema, agora parece que tenho um problema com a criação das telhas e stroing-los no vetor linha .. parece que mesmo através do vetor é criado e passa corretamente, as telhas que deveriam estar nele não são (eles estão perdidos após o:

    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 algum de vocês tem alguma boa idéia sobre como resolver isso, você é bem-vindo para me ajudar;) Nesse meio tempo, eu vou continuar tentando consertá-lo

Foi útil?

Solução

O que é o protótipo para A::getV()?

Estou apenas especulando, mas se A::getV() não retorna uma referência, então ele pode explicar o "iterators Vector são incompatíveis" mensagem de erro.

Na verdade A->getV().begin() e A->getV().end() seria dois iteradores vetores em diferentes :. Cada invocação A->getV() retornando uma cópia diferente do membro privado

Espero que este irá ajudá-lo a depurar o problema.


EDIT: parece que eu prevê-direita: depois de editar a sua pergunta fornecendo detalhes, eu posso ver que você está definindo

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

Como consequência, na seguinte declaração:

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

Como previsto anteriormente, cada chamada para getTiles() irá retornar uma cópia temporária separada do vector membro. Como consequência, os iteradores retornados begin() e end() vêm de vetores diferentes, daí a mensagem de erro que você está enfrentando no momento da execução.

Além disso, como apontado por Charles em sua resposta detalhada , estes vectores temporárias serão destruídos no momento em que o corpo da função de for_each é atingido.

Considere devolver o vector por referência const como esta:

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

E você pode também mudar drawTiles para evitar ainda mais cópias:

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

Outras dicas

O que eu faço é esta: o caminho direto

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 é a ideia geral. I encontrar o complicado método for_each para apenas fazendo um loop duplo. for_each é útil quando você quiser realmente fazer alguma computação em cada elemento (como uma espécie de mapeamento para cada elemento)

Você tem um par de erros graves, mas primeiro um menor.

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

Até o próximo padrão sai você precisa de um espaço entre o que >.

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

Esta função retorna uma vector por valor o que significa que ele cria uma nova cópia de qualquer vector é passado para a instrução de retorno na função. (Presumo que esta declaração da função é a qualquer classe curState é uma instância de.)

Quando você, em seguida, fazer:

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

Cada chamada para getTiles irá retornar uma cópia temporária separada de um vector. Não só isso significa que seus iteradores de begin() e end() vêm de vetores de diferença, mas os vetores serão destruídos pelo tempo que o corpo da função de for_each é atingido.

Parece que você precisa pesquisar referências e passar por referência, porque você precisa entender isso antes de poder utilizar corretamente std::for_each nestes cenários.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top