Zep*_*pee 1 c++ iteration foreach vector
嘿!我正在做这个项目,现在我正在尝试:
无论如何,我只是在网上搜索,我来到了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)
环.如果你们有任何关于解决这个问题的好主意,欢迎你们帮助我;)同时,我会继续努力解决这个问题.
什么是原型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)