c++ - STL 列表迭代器不会更新我的对象

标签 c++ stl iterator

我正在使用列表迭代器将所有宠物的年龄设置为 1,但更改不会在 for 循环之外持续存在:

#include <iostream>
#include <stdio.h>
#include <list>

using namespace std;

class Pet{
  public:
  int age;
};

class Person{
  public:
  list<Pet> pets;
};


int main(int argc, char **argv) {
  Person bob;
  Pet p1;
  p1.age = 0;
  bob.pets.push_back(p1);

  cout << "Start with: "<<p1.age << endl;

  std::list<Pet>::iterator itPet;
  for (itPet = bob.pets.begin(); itPet != bob.pets.end(); ++itPet) {
    Pet p = (*itPet);
    p.age = 1;
    cout << "Right after setting to 1: "<<p.age << endl;
  }

  cout << "After the for loop: "<<p1.age << endl;
  return 0;
}

输出:

Start with: 0
Right after setting to 1: 1
After the for loop: 0

为什么p1没有更新?如果不是 p1,更新了什么?

谢谢!

最佳答案

你只需修改一个拷贝:声明

Pet p = (*itPet);

*itPet 的值复制到 p 然后更新。您可以使用以下代码验证迭代器使用的对象:

p.age = 1;
cout << "Right after setting to 1: p.age="<<p.age << " itPet->age=" << itPet->age << '\n';

您想给我们一个引用:

Pet& p = *itPet;

您用于验证列表中的对象是否已更改的方法也不起作用:标准 C++ 库容器制作插入对象的拷贝,并且不保留对原始对象的引用.也就是说,p1 不会改变,但列表中的元素会改变:

for (std::list<Pet>::const_iterator it(bob.pets.begin()), end(bob.pets.end());
     it != end; ++it) {
    std::cout << "list after change: " << it->age << '\n';
}

关于c++ - STL 列表迭代器不会更新我的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20767634/

相关文章:

c++ - 插入失败时列表/ map 返回什么?

c++ - 如何将 C++ time_t 对象设置为纪元?

php - RecursiveDirectoryIterator 在 "Too many open files"上抛出 UnexpectedValueException

c++ - 变量的值根据 vector 值而变化

java - 如何测试我的 FIX 客户端?那里有我可以使用的假 FIX 交易所吗?

c++ - random_shuffle 列表通过将它复制到一个 vector 然后返回

Javascript For...In 语法问题?

ruby - 如何遍历可能的整数数组,例如从 [1,1,1,1] 到 [1,1,1,2],...最后到 [6,6,6,6]?

c++ - SQLite Blob 插入 C++

c++ - 模板运算符重载中的类型冲突