2016-02-12 4 views
0

У меня есть map данные, как этотОчистка вложенных данных

std::map<std::string, std::vector<int>> mydata; 

Как работает функция mydata.clear(); работы?
Сброс элементов в vector<int> тоже?
Нужно ли сначала очистить пункты vector, а затем очистить карту?

+1

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

ответ

1

Поведение clear()is defined that way:

Очистить содержание
Удаляет все элементы из контейнера карты (которые разрушены), в результате чего контейнер с размером 0.

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

Поэтому, когда вы позвоните mydata.clear(), vectors содержит map, будет соответствующим образом уничтожен, а также их содержимое.

1

mydata.clear() очищает данные в map. map, как вы его определили, хранит std::vector<int>по значению; природа значения гарантирует, что деструктор вектора вызывается, а его содержимое и выделенная память также очищаются.

От cppreference;

Удаляет все элементы из контейнера. Недействительные ссылки, указатели или итераторы, ссылающиеся на содержащиеся элементы.

vector's destructor, в свою очередь, управляет своими ресурсами;

Уничтожает контейнер. Вызывается деструкторы элементов, и используемое хранилище освобождается. Обратите внимание, что если элементы являются указателями, объекты с указателем не уничтожаются.

Правило большого пальца - это то, что контейнер будет управлять ресурсами контейнера; память, размер, распределения и т. д., а значения в контейнере должны управлять своими ресурсами по очереди. Этот подход и технология управления ресурсами обычно известны как RAII и многие считают, что это идиоматический C++.

Смежные вопросы