繁体   English   中英

C ++:遍历向量的向量

[英]C++: Iterating through a vector of vectors

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

  1. 创建一些对象并将其存储在矢量中,这些矢量将存储在另一个矢量V中
  2. 遍历V内部的向量
  3. 遍历各个向量内的对象

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

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

iterateThroug ....只需对传递给它的向量做同样的事情。

现在,我收到一个奇怪的“向量迭代器不兼容”运行时错误。 我已经看过了,在此上找不到任何有用的输入。

我不知道它是否有帮助,但是V是存储在类A中的私有vector <>,它具有对其的访问器,并且我正在尝试通过执行以下操作在类B中进行迭代:

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

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

编辑:好的,所以我认为最好只是发布代码,并且可能会出现问题...

gameState.h中的getTiles:

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

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

创建向量:

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

环。 如果您有任何解决此问题的好主意,欢迎您为我提供帮助;)同时,我将继续尝试解决问题

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()返回的迭代器来自不同的向量,因此在运行时会遇到错误消息。

而且,正如Charles在其详细答案中指出的那样,这些临时向量将在到达for_each的函数体时被销毁。

考虑像这样通过const引用返回向量:

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

您也可以更改drawTiles以避免更多副本:

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

我要做的是:直接方式

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很有用

您有几个严重的错误,但首先是一个小错误。

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

在下一个标准出炉之前,您需要在to >之间留一个空格。

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

此函数按值返回vector ,这意味着它将创建传递给函数中return语句的vector的新副本。 (我假定此函数声明是curState是其实例的任何类。)

当您这样做时:

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

每次对getTiles的调用都将返回向量的单独的临时副本。 这不仅意味着begin()end()迭代器来自差异向量,而且在到达for_each的函数体时这些向量将被销毁。

看来您需要研究引用并逐个引用,因为在这些情况下您需要正确理解std::for_each之前,需要了解这些内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM