C++遍历obj列表并更改/修改值

C++ iterate though list of obj and change/modify value

本文关键字:修改 遍历 obj 列表 C++      更新时间:2023-10-16

我有一个类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 );