Софтуерно Инженерство
Loading...
+ Нов въпрос
zzerro avatar zzerro 11 Точки

Демо 03.Multidimensional-Containers

Здравейте!

В третото демо от урока за STL Linear Containers имаме това:

    int inputMatrixRows, inputMatrixCols;
    cin >> inputMatrixRows >> inputMatrixCols;

    vector<vector<int> > inputMatrix;
    for (int row = 0; row < inputMatrixRows; row++) {
        vector<int> inputRow;
        for (int col = 0; col < inputMatrixCols; col++) {
            int element;
            cin >> element;
            inputRow.push_back(element);
        }

        inputMatrix.push_back(inputRow);
    }

    cout << "The matrix you typed in:" << endl;

    for (int row = 0; row < inputMatrixRows; row++) {
        for (int col = 0; col < inputMatrixCols; col++) {
            cout << inputMatrix[row][col] << " ";
        }
        cout << endl;
    }

Не трябва ли след

inputMatrix.push_back(inputRow);

да изчистим вектора(т.е. РЕДА) с едно 

inputRow.clear();

?

Тагове:
0
C++ Fundamentals
galin_kostadinov avatar galin_kostadinov 67 Точки
Best Answer

Привет!

Този вектор след всяка итерация се създава наново:

for (int row = 0; row < inputMatrixRows; row++)
 vector<int> inputRow;

Реално той се зачиства от паметта, тъй като излиза извън скоупа в който е съдаден, но тъй като е добавен(копиран) в:

vector<vector<int> > inputMatrix;

то inputMatrix вече има тези стойности. За сметка на това обаче ключа inputRow вече не държи връзка към дадения вектор, този ключ вече не съществува в нашата програма. При всяка итерация на цикъла отново се създава вектор, използваш този ключ, тъй като той вече не е зает да държи нещо друго, но пък чрез този дефолтен конструктор -> vector<int> name; ти създаваш вектор от int-тове всеки път.

STL контейнерите  си имат деконструктор, той се грижи за освобождаването на паметта.

Ако използваш пойнтъри за създаването на масив, когато се заделя динамична памет чрез new тогава вече трябва да се погрижеш за освобождаването на паметта.

Поздрави!

 

2
08/10/2019 16:33:03
zzerro avatar zzerro 11 Точки

Благодаря за отговора!

0