对于Iterator-For-Loop中的循环

时间:2014-06-02 08:36:39

标签: c++ for-loop iterator

我坐在一个我不知道解决方案的问题面前。 最后我总是得到一个分段错误。

我创建了一个“Map”类,我存储了以下信息,这个Map在Gameclass中存储为Vector

class Map
{
  private:
    unsigned int map_id_;
    unsigned int map_width_;
    unsigned int map_height_;
    std::vector< std::vector< int > > fields_;
    Game *game_;

class Game
{
  private:
    ...
    std::vector< Map* > *v_map_;
    ...


std::vector< Map* > Game::getMapVector()
{
  return *v_map_;
}

在游戏类中,我填写了信息,包括字段矢量。

  for(int i = 0; i < height; i++)
  {
    std::vector< int > row;

    for (int j = 0; j < width; j++)
    {
      is.read(reinterpret_cast<char*>(&fields), 1);
      counter = counter - 1;
      row.push_back(int(fields));
    }

    fields_vector.push_back(row);
  }

如果我尝试在readin-process中直接输出我的地图,一切都很完美。

  for (int i = 0; i < height; i++)
  {
    for (int j = 0; j < width; j++)
    {
      std::cout << fields_vector[i][j];
    }
    std::cout << std::endl;
  }

直到现在一切正常。但是现在我得到了分段错误,如果我在自动迭代器中使用for循环调用它。

如果我尝试在第一个for循环中只输出一个带std::cout << (*it)->getMapFields()[1][1]的元素,我会在这个位置得到正确的输出。

for(auto it = std::begin(game.getMapVector()); it != std::end(game.getMapVector()); it++)
{
  std::cout << "ID: " << (*it)->getMapId()
    << ", width: " << (*it)->getMapWidth()
    << ", height: " << (*it)->getMapHeight() << std::endl;


  for (int i = 0; i < (*it)->getMapHeight(); i++)
  {
    for (int j = 0; j < (*it)->getMapWidth(); j++)
    {
      std::cout << (*it)->getMapFields()[i][j];
    }
    std::cout << std::endl;
  }
}

有没有我没看到的东西?也许在自动迭代器中不能使用for循环?

提前感谢您的帮助, 菲利普

1 个答案:

答案 0 :(得分:5)

一个错误是:

std::vector< Map* > Game::getMapVector()

返回一个新的std::vector<Map*>实例。这意味着以下begin循环中使用的endfor迭代器引用不同的 std::vector个实例:

for(auto it = std::begin(game.getMapVector()); 
   it != std::end(game.getMapVector());
   it++)

可能的解决方案:

  • getMapVector()的结果存储到局部变量并将其用于迭代
  • 更改getMapVector()以返回对const
  • std::vector<Map*>)引用