我有一个类Person,它有一个字符串变量表示name,int变量表示age。
在主函数中,我创建了两个人,然后将两个人添加到人员列表中,然后传递到一个函数来更新年龄:
Person p1 = Person("personA", 4) // personA is 4 years old
Person p2 = Person("personB", 6) // personB is 6 years old
list<Person> list1; // create a list of Person
list1.push_back(p1); // push personA to list
list1.push_back(p2); // push perosnB to list
updateAge(list1); // pass to another function to update age
我的问题是,你如何迭代列表中的每一项并更新年龄?我正在考虑创建指针(但不确定)。有人能给我什么提示吗?
如此:
void updateAge(list<Person> & people)
{
for (list<Person>::iterator i = people.begin(); i != people.end(); ++i) {
i->age(i->age() + 1);
}
}
这假设您在Person
:上有如下getter和setter成员
int age() const;
void age(int);
您可以在for
循环中使用i->
前缀访问当前Person
对象的任何成员。因此,如果你有一个public: int age;
成员,你可以这样做:
++(i->age);
注意,我编写的示例函数的参数是list<Person> &
(对列表的引用),而不是list<Person>
(按值列表)。如果不将参数设为引用,则在调用函数时,列表(及其包含的所有Person
对象!)将被复制,并且函数将接收该副本,该副本独立于原始列表。当函数返回时,复制的列表及其内容将被销毁,对复制的列表所做的任何修改都将丢失。
通过引用传递(正如我的示例函数中所做的那样)意味着代码中的people
参数和list1
变量将引用同一列表,因此可以通过另一个变量来观察对一个变量所做的更改。
最简单的方法是:
for ( auto &person : people )
++person.age;
除了那些已经发布的之外,另一个选择是制作一个函数来为一个人做这项工作,然后使用标准算法将其应用于整个列表。
通过这种方式,您可以将list
更改为不同的容器,然后不必更改任何其他代码。或者你可以一次只在列表的一部分上做,以此类推
void update_age(Person &p)
{
++p.age;
}
// ... in another function
std::for_each( people.begin(), people.end(), update_age );