“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_vecc实际上只是一个元素的副本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();


以上是“for(std::vector&lt;int&gt;::iteratorit=my_vec.begin();it!=my_vec.end();++it)”和“for(inti:my_vec)”之间的奇怪区别的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>