Я получаю «векторный индекс вне диапазона» ошибка

Я пишу программу для чтения некоторых чисел из текстовых файлов и сохранения их в матрицах с помощью 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;
}

-1

Решение

Я не знаю с чего начать. Вы создаете много временных
векторы, которые вы никогда не используете; тогда вы выводите вектор
построен без каких-либо данных, которые вы читаете. Ты считаешь
строки и линии, хотя сами векторы будут делать это
для тебя. И, как указывает @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 следить за размером. Не создавайте новый
вектор каждый раз во внутреннем цикле. И только создать вложенный
один (тот, который вы отталкиваете) во внешнем цикле.

0

Другие решения

Во втором цикле for вы должны проверить соответствие mat [j] и не всегда первый элемент.

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector