Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

zzerro avatar zzerro 16 Точки

Демо 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 166 Точки
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 16 Точки

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.