为什么vector :: clear在foreach循环中不起作用?

时间:2019-01-15 19:21:36

标签: c++ for-loop vector foreach

我的代码:

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)中的代码无法清除数组中的向量,而简单的 for 循环(#02)却不能清除数组中的向量成功吗?

演示:https://onlinegdb.com/B1m8-2jG4

1 个答案:

答案 0 :(得分:6)

写作时

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

然后将auto推导出为std::vector<int>,因此vecv元素的副本。您清除了副本,但保持实际元素不变。如果要对元素本身进行操作,则必须使用引用:

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

我个人的经验法则是在使用auto时始终明确提及指针性,常数性和引用性。我认为它使auto的用法更具可读性,但这仅是我的看法。请注意,这里您别无选择,但是如果您遵循规则,您可能会更容易意识到vec是值,而不是引用。