Почему не удаляется векторный контент? - PullRequest
0 голосов
/ 26 марта 2019

Если v1 очищен, содержимое исчезнет в v2?Почему не исчезает?В чем причина?

vector<string> v1;
vector<vector<string>> v2;
v1.push_back("a");
v1.push_back("b");
v2.push_back(v1);
v1.clear();

Ответы [ 3 ]

0 голосов
/ 26 марта 2019

Ваши данные v1 удаляются после копирования в v2,
v2 сохраняет данные v1, поэтому это не влияет на v2

0 голосов
/ 26 марта 2019

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

v2.push_back(v1);

, создается копия v1 для вставки в v2.

std :: vector сохраняет всю память непрерывной, поэтому редко используется возможность избежать этой копии при использовании std :: vector.

С другими типами контейнеров STL может быть возможноизбегайте копирования, если жизнь v1 заканчивается во время вставки, что подразумевает использование конструктора перемещения.Тем не менее, это обычно не происходит с std :: vector.

0 голосов
/ 26 марта 2019

Ваше задание является копией, а не оригиналом v1. после помещения копии v1 в v2 они разделяются. поэтому, независимо от того, что вы сделали с v1, он ничего не сделает с v2. Вы можете попытаться понять, как работает вектор, операция присваивания является копией, а не ссылкой.

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