Вызов clear на контейнере STL контейнеров STL - PullRequest
0 голосов
/ 01 октября 2018

Я использую

std::vector<std::vector<int>> S;, но проблема может относиться и к любому дополнительному измерению вложенности.

Для удаления содержимого из S достаточно ли это из-за эффективности /точка зрения памяти для вызова S.clear(); или должен сначала clear сохраненный контейнер, в данном случае std::vector<int>, а затем S.clear(); как:

std::vector<std::vector<int>>::iterator iter;
for (iter = S.begin(); iter != S.end(); iter++) {
    iter->clear();
}
S.clear();

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Просто позвоните clear на крайний контейнер.Деструктор контейнеров автоматически очистит их пространство.Единственное, на что нужно обратить внимание, это если где-то внизу у вас есть сырые указатели.Если у вас есть код, который делает это, просто измените его, чтобы использовать любой тип указателя умного владения, владение объектом по значению или другой уровень вложенности контейнера вместо необработанного указателя.

0 голосов
/ 01 октября 2018

Чтобы быть уверенным, что вы действительно освободили память, вы можете сделать что-то вроде:

std::vector<std::vector<int>>().swap(S);
0 голосов
/ 01 октября 2018

Вызов clear() для вложенных векторов не требуется.Когда вы вызываете clear() на самом внешнем векторе, он уничтожит каждый элемент в векторе.Это, в свою очередь, уничтожит все вложенные векторы.

std::vector - это тип RAII, поэтому, пока вы храните в нем тип RAII, он будет работать правильно, поскольку типы очищаются после себя..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...