Как записать двуменый массив в вектор? С++

222
26 апреля 2017, 12:27

Выдаёт ошибку: vector subscript out of range. Никак не могу найти ошибку. Помоги пожалуйста.

#include <iostream>
#include <vector>    
#include <iostream>
#include <math.h>
using namespace std;
vector<vector<int>> undef;
void undefMatrix( int col) {
    int i, j, n, row2, k, p, c;
    row2 = pow(2, col);
    int binary[11][1025];
    for (i = 1; i <= col; i++)
        for (j = 1; j <= row2; j++)
            binary[i][j] = 0;
    for (j = 1; j <= col; j++)
    {
        k = row2 / (pow(2, j));
        p = 0;
        c = 0;
        for (i = k + 1; i <= row2; i++)
        {
            if (p<k)
            {
                binary[j][i] = 1;
                p++;
            }
            else if (c<k - 1)
            {
                binary[j][i] = 0;
                c++;
            }
            else
            {
                p = 0;
                c = 0;
            }
        }
    } 
     undef.resize(col);
    for (int i = 0; i < col; i++)
        undef[i].resize(row2);
    for (int i = 1; i <= col; i++) {
        for (int j = 1;  j <= row2; j++) {      
            undef[i][j] = binary[i][j];
        }
    } 
    for (int i = 0; i < undef.size(); i++) {
        for (int j = 0; j < undef[i].size(); j++) {
            cout << undef[i][j];
        }
        cout << endl;
    }  
}
int main() {
    int col;
        cout << "Enter number of columns of matrixes: ";
    cin >> col;
    undefMatrix(col);
    system("pause");
    return 0;
}
Answer 1

У вас предпоследний цикл двойной идёт от 1 до col (включительно) и от 1 до row2 (включительно). А вектор размера col на row2. У него нет элемента undef[col][row2] и вообще никаких элементов дальше undef[col-1][row2-1].

Когда вы пишите vector.resize(5) это значит выделить память (минимум) под пять элементов и предоставить вам доступ только к этим пяти элементам. То есть от vector[0] до vector[4]

Если позволите, то ещё несколько общих советов:

Зачем использовать статический массив вообще? Используйте сразу вектор.

Если вам нужно возвести 2 в какую-то степень, используйте битовые сдвиги.

Если вам нужно занулить непрерывный участок памяти (для C-style одномерных массивов), используйте memset.

Старайтесь избегать циклов, начинающихся с 1 при обходе контейнеров или массивов. Приучите себя начинать счёт всегда с нуля.

Не делайте глобальных переменных там, где в этом нет смысла (а лучше вообще никогда не делайте глобальных переменных).

Использование в цикле for метода std::vector::size лучше избегать, чтобы он каждый раз не вызывался на новом шаге. Выносите его из цикла, присваивайте значение переменной и используйте в цикле её.

READ ALSO
Ошибка в строке с break (Uncaught SyntaxError: Illegal break statement)

Ошибка в строке с break (Uncaught SyntaxError: Illegal break statement)

оператор break может использовать только внутри цикла

420
Событие на scroll

Событие на scroll

Как сделать событие, которое запускается когда scroll достигает самого верха в блоке?

256
Что в js означает (function() { })();? [дубликат]

Что в js означает (function() { })();? [дубликат]

На данный вопрос уже ответили:

252
Возврат функции из функции - как работает замыкание?

Возврат функции из функции - как работает замыкание?

Учу js и, к сожалению, не понял одну вещь

290