2017-10-18 44 views
-1

我新的矢量编程,所以我的代码是马车:写入2D矢量,崩溃我的程序

#include <fstream> 
#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
int main() 
{ 
    std::ifstream in("input.txt"); 
    std::vector<std::vector<int> > v, w; 

    if (in) { 
     std::string line; 

     while (std::getline(in, line)) { 
      v.push_back(std::vector<int>()); 

      for(int x=0; x<line.size(); x++){ 
       v.back().push_back((int)line[x] - (int)'0'); 
      } 
     } 
    } 

    for (int i = 0; i < v.size(); i++) { 
     for (int j = 0; j < v[i].size(); j++) 
      std::cout << v[i][j] << ' '; 

     std::cout << '\n'; 
    } 

    int size = v.size(); //because its a square matrix 
    w = v; //w is our temp vector for storing new values; 
    int alive =0; 
    int z=0; 
    for (int i=0;i<size;i++) 
    { 
     for (int j=0;j<size; j++) 
     { 
      alive = 0; 
      for(int c = -1;c<2; c++) 
      { 
       for(int d = -1; d<2 ; d++) 
       { 
        if(!(c==0 && d == 0)) 
        { 
         z = v[i+c][j+d]; 
         if(z) 
          ++alive; 
        } 
       } 

       if(alive<2) w[i].push_back(0); 
       else if(alive == 3) w[i].push_back(1); 
       else w[i].push_back(0); 
      } 
     } 
    } 
    return 0; 
} 

我想我分配值到我的第二个变量是错误的。我的程序从沿线的输入文件上写着:

1010101 
0101010 
1010101 

,并分析其邻国(生活不能玩的游戏),我想我应该用w.push_back()后写入第二矢量w,但我不知道在2D矢量的语法上。有没有更好的方法来推动变量?

+0

'z = v [i + c] [j + d];' - 将其更改为'z = v.at(i + c).at(j + d);' - 然后诊断正在抛出的'std :: out_of_range'异常。 – PaulMcKenzie

回答

0

我注意到了两个问题。导致崩溃的主要原因是您正在访问v阵列的界限之外。当i为0且c为-1时发生这种情况,并且当isize-1c为+1时也会发生(同样的情况发生在jd)。

另一个问题是如何将alive值保存到w。由于您从w = v开始,因此您拥有所有您需要的元素。只需将它们替换为例如w[i][j] = 0即可。 (您还需要将该条件块移到c循环之外)。