Почему vector :: clear не работает внутри цикла foreach? - PullRequest
0 голосов
/ 15 января 2019

Мой код:

vector<int> v[10];
const int x = 3;
void clearBySimpleLoop(){
    for (int i = 0; i < x; i++){
        v[i].clear();
    }
}
int main()
{
    for (int i = 0; i < x; i++){
        v[i].push_back(11+i);
        v[i].push_back(11+i+1);
        v[i].push_back(11+i+2);
    }
    for (auto vec : v) vec.clear(); //#01. Contents are not cleared. Size of the contained vectors remains same.
    clearBySimpleLoop(); //#02. Contents are cleared. Size of the contained vectors becomes zero. 
    return 0;
}

Вопрос в том, почему код внутри цикла foreach (# 01) не может очистить вектор в массиве, в то время как простой цикл для (# 02) делает это успешно ?

Демо: https://onlinegdb.com/B1m8-2jG4

1 Ответ

0 голосов
/ 15 января 2019

Когда вы пишете

for (auto vec : v) vec.clear(); //

затем auto выводится как std::vector<int>, следовательно, vec являются копиями элементов v. Вы удаляете копии, но оставляете фактические элементы без изменений. Если вы хотите работать с самими элементами, вы должны использовать ссылки:

for (auto& vec : v) vec.clear();

Мое эмпирическое правило - всегда явно упоминать остроту, константность и эталонность при использовании auto. Я думаю, что это делает использование auto намного более читабельным, но это только мое мнение. Обратите внимание, что здесь у вас нет выбора, но если бы вы следовали правилу, вы могли бы легче понять, что vec являются значениями, а не ссылками.

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