循环帮助3D矢量C ++

时间:2015-07-02 17:45:58

标签: c++ loops vector

我试图采用可变长度的输入文件,如下所示:

xxooo##xx
xoxxxoxoo
xxx#oxoo#
oxxxoxoox
xxoooo#xx

并将其转换为3D字符向量,其中每行为3x3框,前三个字符为第一行,后三个为第二行,后三个为第3行。例如,输入的第一行应该变为:

x x o
o o #
# x x

这是我尝试解决的问题,但是当我尝试运行它时,我遇到了分段错误。我是C ++的新手,所以这是我第一次尝试使用3D矢量而且我没有任何明确的错误信息可以继续,所以我有点卡住了。

vector<vector<vector<char> > > makeBoard(vector<string> iflines)
{// Function to fill game boards from input strings

vector<vector<vector<char> > > charboard;

for (int i = 0; i != iflines.size(); i++) 
{   
    for (int j = 0; j < 9; j=j+3)
    {
        charboard[i][j/3][0] = iflines[i][j]; 
        charboard[i][j/3][1] = iflines[i][j+1];
        charboard[i][j/3][2] = iflines[i][j+2];     
    }   
}
    return charboard;
}

3 个答案:

答案 0 :(得分:4)

vector<vector<vector<char> > > makeBoard(vector<string> iflines)
{// Function to fill game boards from input strings

    vector<vector<vector<char> > > charboard;

    for (int i = 0; i != iflines.size(); i++) 
    {   
        vector<vector<char> > line(3, vector<char>(3));
        for (int j = 0; j < 9; ++j)
        {
            line[j / 3][j % 3] = iflines[i][j];
        }
        charboard.push_back(line);
    }
    return charboard;
}

对于iflines的每个元素,line被初始化为char的向量的3x3向量。它被填充在循环中并被推到charboard的后面。

答案 1 :(得分:2)

或者,一行初始化可能类似于

<ui-gmap-google-map center='{expression}'
                    control='{Object}'
                    zoom='{expression}'
                    dragging='{expression}'
                    refresh='{expression}'
                    options='{expression}'
                    events='{expression}'
                    bounds='{expression}'
                    pan='{string or boolean}'
        >

    <!-- other ui-gmap-directives here -->

</ui-gmap-google-map>

答案 2 :(得分:0)

您正在按索引访问charboard的元素,但尚未对其进行初始化。

您可以使用push_back但您知道向量的大小,因此最好将其初始化为正确的大小。外部维度为iflines.size()。内部的两个维度分别为3和3.由于它们很小并且在编译时已知,因此内部类型可能值得使用固定大小的内容,如array

using Board = std::array<std::array<char, 3>, 3>;

然后你可以写:

std::vector<Board> makeBoard(const std::vector<std::string>& iflines)
{
  std::vector<Board> charboard(iflines.size());

  for (int i = 0; i != iflines.size(); i++)
  {
    for (int j = 0; j != 9; ++j)
    {
      charboard[i][j / 3][j % 3] = iflines[i][j];
    }
  }
  return charboard;
}