“for(std::vector<int>::iteratorit=my_vec.begin();it!=my_vec.end();++it)”和“for(inti:my_vec)”之间的奇怪区别
我见过很多论坛上说,for(std::vector<int>::iterator it = my_vec.begin(); it != my_vec.end(); ++it)和for(int i:my_vec)是相同的。但是当我运行以下代码(PART A 和 PART B)时:
class my_class
{
public:
void increase_age(){age_++;}
private:
int age_;
}
int main()
{
std::vector<my_class> my_vec={smth,smth,smth,...};
// PART A
for (std::vector<my_class>::iterator it = my_vec.begin(); it != my_vec.end(); it++)
{
// age is successfully increased!
it->increase_age();
}
// PART B
for (my_class c:my_vec)
{
// age does not increase at all when I checked outside this loop
c.increase_age();
}
return 0;
}
我意识到PART B根本没有增加age。这是否意味着当我这样做时my_class c:my_vec,c实际上只是一个元素的副本my_vec?还是我对此有其他误解?
回答
在 中(my_class c : my_vec),c是一个对应元素的副本。而在it->increase_age()您取消引用迭代器时,它可以访问容器的实际元素。
在 的情况下my_class c,在increase_age()本地(循环体)副本上调用。因此,my_vec.
如果将 声明c为对 的引用,则可以具有相同的效果my_class:
for (my_class &c : my_vec)
c.increase_age();
THE END
二维码