C ++:迭代向量向量

时间:2009-11-27 21:18:28

标签: c++ iteration vector foreach

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

  1. 创建一些对象并将它们存储在向量中,这些向量存储在另一个向量V
  2. 遍历V
  3. 内的向量
  4. 遍历各个向量中的对象
  5. 无论如何,我只是在网上搜索,我来到了stl for_each函数。看起来很整洁,但我遇到了问题。我试图以这种方式使用它:

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

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

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

    我不知道它是否有帮助,但V是一个私人载体<>存储在A类中,它有一个访问器,我试图通过执行以下操作在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:谢谢你们,这完美地工作......对于那个问题,现在好像我有一个问题,创建瓷砖并在行向量中stroing它们。似乎即使通过向量创建并正确传递,应该在其中的瓷砖不是(它们在以下之后丢失:

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

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

3 个答案:

答案 0 :(得分:7)

A::getV()的原型是什么?

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

确实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 in his detailed answer所指出的,这些临时向量将在到达for_each的函数体时被销毁。

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

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

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

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

答案 1 :(得分: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 :(得分:2)

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

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

在下一个标准出来之前,你需要在>

之间留一个空格
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之前,您需要了解这些内容。