Когда вы пишете
for (auto vec : v) vec.clear(); //
затем auto
выводится как std::vector<int>
, следовательно, vec
являются копиями элементов v
. Вы удаляете копии, но оставляете фактические элементы без изменений. Если вы хотите работать с самими элементами, вы должны использовать ссылки:
for (auto& vec : v) vec.clear();
Мое эмпирическое правило - всегда явно упоминать остроту, константность и эталонность при использовании auto
. Я думаю, что это делает использование auto
намного более читабельным, но это только мое мнение. Обратите внимание, что здесь у вас нет выбора, но если бы вы следовали правилу, вы могли бы легче понять, что vec
являются значениями, а не ссылками.