我得到“矢量下标超出范围”错误

时间:2014-02-25 19:16:48

标签: c++ vector matrix assertion

我正在编写一个程序,用于从txt文件中读取一些数字,并用c ++将它们保存到矩阵中。但我并不熟悉矩阵概念而且有点困惑。当我尝试运行该程序时,我得到了矢量订阅超出范围错误,如果有人查看我的代码并告诉我正确的方式,我不知道该怎么做。

这是我的代码

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include "strutils.h"
#include <iomanip>
using namespace std;

void Print(const vector<vector<int>> & mat)
{
for (int j=0; j < mat.size(); j++)
{   
    for (int k=0; k < mat[0].size(); k++)
    {   
        cout << mat[j][k];
    }
    cout << endl;
}
}


int main()
{
string filename;
int countRow = 0, countCol = 0, emptyCount = 0;
cout << "Please enter the input file name: ";
cin >> filename;

ifstream input;
input.open(filename);

while(input.fail())
{
    cout<< "Could not open the file please enter the correct file name:";
    cin >> filename ;
    input.open(filename);
}

while(!input.eof())
{
    string s;
    int num;
    while (getline(input, s))
    {
        countRow++;
        vector<vector<int>> mat(countRow, vector<int>(countCol));
        istringstream input(s);
        while (input >> num)
        {
            countCol++;
            emptyCount++;
            vector <int> row(countCol);
            mat.push_back(row);
            mat [(countRow - 1)] [(countCol - 1)] = num;
        }
        countCol = 0;

    }


}
vector<vector<int>> mat(countRow, vector<int>(emptyCount/countRow));
Print(mat);

cin.get();
cin.ignore();
return 0;
}

2 个答案:

答案 0 :(得分:0)

我不知道从哪里开始。你正在创造许多临时的 矢量,你永远不会使用;然后你输出一个矢量 在没有您阅读的任何数据的情况下构建。你在数 行和行,虽然向量本身将执行此操作 为了你。正如@Nick指出的那样,你有一个mat[countRow - 1][countCol - 1],其中countCol保证更大 而不是它索引的矢量。怎么了? 以下是您的阅读循环:

std::vector<std::vector<int>> mat;
std::string line;
while ( std::getline( input, line ) ) {
    mat.push_back( std::vector<int>() );
    std::istringstream input( line ):
    int num;
    while ( input >> num ) {
        mat.back().push_back( num );
    }
}

std::vector跟踪大小。不要创建新的 每次在内循环中矢量。并且只创建一个嵌套 一个(你推回的那个)在外循环中。

答案 1 :(得分:0)

在第二个for循环中,你应该检查mat [j]而不是第一个元素。

for (int k=0; k < mat[j].size(); k++)