C++:迭代向量向量

Zep*_*pee 1 c++ iteration foreach vector

嘿!我正在做这个项目,现在我正在尝试:

  1. 创建一些对象并将它们存储在向量中,这些向量存储在另一个向量V中
  2. 迭代V内的向量
  3. 迭代各个向量内的对象

无论如何,我只是在网上搜索,我来到了stl for_each函数.看起来很整洁,但我遇到了问题.我试图以这种方式使用它:

for_each(V.begin(), V.end(), iterateThroughSmallVectors);
Run Code Online (Sandbox Code Playgroud)

iterateThroug ....只是在传递给它的向量上做同样的事情.

现在我得到一个奇怪的"矢量迭代器不兼容"运行时错误.我已经查看了它,但在此找不到任何有用的输入..

我不知道它是否有帮助,但V是存储在A类中的私有向量<>,它有一个访问器,我试图通过执行以下操作在B类中迭代它:

A->getV().begin(), A->getV().end(), etc..
Run Code Online (Sandbox Code Playgroud)

任何人都知道发生了什么事?

编辑:好的,所以我认为发布代码更好,问题可能会出现......

gameState.h中的getTiles:

vector<vector<tile*>> getTiles();
Run Code Online (Sandbox Code Playgroud)

main.cpp中的for_each循环:

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();
}        
Run Code Online (Sandbox Code Playgroud)

创建向量:

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;
}
Run Code Online (Sandbox Code Playgroud)

以防万一它可能是相关的:

void gameState::setTiles(vector<tile*> val)
{
    tiles.push_back(val);
}
Run Code Online (Sandbox Code Playgroud)

现在更容易发现问题吗?我希望如此......如果你确实发现了我可能正在做的任何愚蠢的事情,请让我知道,我是C++的新手,指针和引用仍然让我感到困惑.

编辑2:谢谢你们,这完美地工作......很好地解决了这个问题,现在看来我有一个问题就是创建瓷砖并在行向量中对它们进行划分..似乎即使通过向量创建并正确传递,应该在其中的瓷砖不是(它们在以下之后丢失:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

环.如果你们有任何关于解决这个问题的好主意,欢迎你们帮助我;)同时,我会继续努力解决这个问题.

Gre*_*osz 7

什么是原型A::getV()

我只是推测,但如果A::getV()没有返回引用,那么它可以解释"矢量迭代器是不兼容的"错误消息.

实际上A->getV().begin(),A->getV().end()它将是两个不同向量的迭代器:每次A->getV()调用返回私有成员的不同副本.

希望这可以帮助您调试问题.


编辑:看起来我的预期是正确的:在编辑了提供详细信息的问题后,我可以看到你正在定义

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

因此,在以下声明中:

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

如上所述,每次调用都getTiles()将返回成员向量的单独临时副本.因此,迭代器从不同的向量返回begin()end()来自不同的向量,因此您将在运行时遇到错误消息.

此外,正如查尔斯在其详细答案中指出的那样,这些临时向量将在for_each到达函数体时被破坏.

考虑通过const引用返回向量,如下所示:

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

你也可以改变drawTiles以避免更多的副本:

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