2009-11-27 4 views
1

Эй, там! Я делаю этот проект и сейчас я пытаюсь:C++: Итерация через вектор векторов

  1. создать некоторые объекты и хранить их в векторах, которые откладываются в другом векторе V
  2. итерации через векторы внутри V
  3. итерации через объекты внутри отдельных векторов

Во всяком случае, я просто искал в Интернете, и я пришел через функцию stl for_each. Это кажется довольно опрятным, но у меня проблемы с ним. Я пытаюсь использовать его таким образом:

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

iterateThroug .... просто делает то же самое на вектор переданного ему ..

Теперь я получаю странные «Вектор итераторы несовместимая "ошибка времени выполнения. Я посмотрел на него и не нашел никакого полезного ввода.

Я не знаю, помогает ли он, но V является частным вектором <> хранится в классе A, который имеет аксессор к нему , и я пытаюсь итерацию через него в классе B, выполнив:

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

Кто есть какие-либо идеи о том, что происходит?

EDIT: Хорошо, так что я думаю, что лучше просто разместить код, и где проблемы могут быть arrising ...

getTiles в gameState.h:

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

for_each петли в основной .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(); 
}   

создания векторов:

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

и только в случае, если это может иметь отношение:

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

ли легче обнаружить эту проблему сейчас? Надеюсь, что так ... И если вы заметите какие-то глупые вещи, которые я мог бы сделать, сообщите мне, я новичок в C++, и указатели и ссылки все еще меня путают.

EDIT2: Спасибо, ребята, которые отлично работали ... хорошо для этой проблемы, теперь, похоже, у меня возникла проблема с созданием плиток и их хождением в вектор строки. Кажется, что даже через вектор создан и проходит правильно, плитки, которые должны были быть в нем нет (они теряются после того, как:.

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

петля Если какой-либо из вас есть какие-либо хорошие идеи о решении этого вы всегда можете помочь я;) Между тем, я буду продолжать пытаться исправить это

+6

Я думаю, вам нужно будет отправить точный код и особенно отметить строку, в которой вы нажимаете эту ошибку во время выполнения. –

ответ

7

Что такое прототип для A::getV()?

Я только размышляю, но если A::getV() не возвращает ссылку, то это может объяснить сообщение об ошибке «Итераторы несовместимы».

A->getV().begin() Действительно и A->getV().end() бы два итератор над различными векторами: каждый A->getV() Призыв возвращает другую копию личного члена.

Надеюсь, это поможет вам отладить вашу проблему.


EDIT: это выглядит как я ожидал, это правильно: после редактирования вопроса обеспечивая детали, я могу видеть, что вы определяете

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

Как следствие, в следующем заявлении:

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

Как и предполагалось выше, каждый вызов getTiles() вернется отдельную временную копию вектора-члена. Как следствие, итераторы возвращались с begin(), а end() - из разных векторов, поэтому сообщение об ошибке вы столкнулись во время выполнения.

Также, как указано Charles in his detailed answer, эти временные векторы будут уничтожены к моменту достижения функционального тела for_each.

Рассмотрим возвращение вектор по константной ссылке, как это:

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

И вы можете также изменить drawTiles, чтобы избежать еще большего количества копий:

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

4

Что я делаю: прямой путь

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

Это грубая идея. Я считаю, что метод for_each является громоздким для выполнения двойного цикла.for_each полезен, когда вы хотите действительно выполнить некоторые вычисления для каждого элемента (например, какое-то отображение для каждого элемента)

2

У вас есть несколько серьезные ошибки, но сначала незначительные.

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

До следующего стандарта не выходит вам нужно пространство между к >.

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

Эта функция возвращает vector по значению, которое означает, что он создает новую копию любой vector передается на заявление возвращения в функции. (Я предполагаю, что эта функция декларация является то, что класс curState является экземпляром.)

Когда вы после этого сделать:

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

Каждый вызов getTiles возвращает отдельную временную копию вектора.Это означает не только то, что ваши итераторы от begin() и end() поступают из векторов разностей, но векторы будут уничтожены к тому времени, когда будет достигнуто тело функции for_each.

Похоже, вам нужно исследовать ссылки и передавать их по ссылке, потому что вам необходимо их понять, прежде чем вы сможете правильно использовать std::for_each в этих сценариях.

+0

, который в основном является тем, что я объяснил;) –

+0

@Gregory Pakosz: В то время, когда я начал этот ответ, вы не видели редактирование с помощью «реального» кода. Возможно, вы хотите украсть предупреждение о временном (я думаю, это важный момент для понимания) и '>>'/'>>' для вашего ответа? –

+0

@Charles - Конечно, со своей стороны это было просто «великие умы, которые думают одинаково», - забавляло чувство. Я отредактировал ответ, чтобы включить детали из ваших о временном уничтожении во время достижения тела 'for_each'; а также ссылку на него, чтобы люди читали ваш комментарий о '>> />>'. Вы определенно имеете мой голос! –

Смежные вопросы