Задать вопрос
lleviy
@lleviy

Как оптимально считать матрицу с консоли c++?

Требуется считать матрицу с консоли, на вход подается:
2 2
1 3
4 5

, где первая строка это количество строк и столбцов, все последующие - сама матрица.

Я пытался сделать так. Вылетает ошибка сегментации еще на строчке с getline (подозреваю, что и дальше тоже вылетит ошибка в попытке запушить в g[i]).
int main() {
    int n, k;
    char *str;
    vector < vector<int> > g;
    cin >> k >> n;
    for (int i = 0; i < k; i++) {
        cin.getline(str, n * 2 - 1);
        for (int j = 0; j < n * 2 - 1; j=j*2){
            g[i].push_back(atoi(reinterpret_cast<const char *>(str[j])));
        }
    }
}


Может есть более простой способ сделать это? И можете объяснить, почему getline дает ошибку сегментации, вроде с кодом все нормально до этого момента.
  • Вопрос задан
  • 811 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Если вы хотите оптимизировать программу по времени выполнения, то необходимо задать нужный размер матрицы с самого начала, так как он у вас известен. Например так:
std::size_t r = 0, c = 0;
std::cin >> r >> c;
std::vector<std::vector<int>> matrix(r, std::vector<int>(c));

Далее, у вас же просто числа, которые можно читать сразу в переменную:
for (std::size_t i = 0; i < c; ++i)
	for (std::size_t j = 0; j < r; ++ j)
		cin >> matrix[j][i];


Сразу скажу, я это не компилировал, не запускал и не проверял работает или нет. Если возникают какие-то ошибки, то пользуйтесь отладчиком.

PS
Первая ошибка в вашем коде заключается в том, что вектор g пустой в момент обращения по индексу. Замените [] на метод at() и получите исключение.
Ответ написан
Комментировать
@TriKrista
вы, скорей всего, не правильно используете метод cin.getline
вот первая ссылка по этому вопросу

И еще вы обращаетесь в недоступный для записи участок памяти:
g[i].push_back(...
Для решения второй проблемы можно предварительно выделить память для вектора при помощи метода reserve()

или переписать часть кода как то так:
vector<int> v;
for (int j = 0; j < n * 2 - 1; j=j*2){
     v.push_back(atoi(reinterpret_cast<const char *>(str[j])));
}
g.push_back(v);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
BacCM
@BacCM
C++ почти с рождения
getline надо передавать указатель на уже выделенный блок памяти
можно вместо istream::getline использовать std::getline(istr, string)
Ну и дальше по коду всё ещё хуже
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы