我的代码:
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)却不能清除数组中的向量成功吗?
答案 0 :(得分:6)
写作时
for (auto vec : v) vec.clear(); //
然后将auto
推导出为std::vector<int>
,因此vec
是v
元素的副本。您清除了副本,但保持实际元素不变。如果要对元素本身进行操作,则必须使用引用:
for (auto& vec : v) vec.clear();
我个人的经验法则是在使用auto
时始终明确提及指针性,常数性和引用性。我认为它使auto
的用法更具可读性,但这仅是我的看法。请注意,这里您别无选择,但是如果您遵循规则,您可能会更容易意识到vec
是值,而不是引用。