如何在循环中改变容器中的元素

How do I mutate elements in a container in a loop?

本文关键字:元素 改变 循环      更新时间:2023-10-16

有一个对象列表,并按每个对象调用一个函数,但不能保留上下文,例如:

std::list<Ob> objs;
Ob ob;
ob.settings(/*...*/);
objs.push_back(ob);
/*...*/
for (Ob obj : objs)
{
    obj.increase();
}

increase()函数对本地变量求和,例如:

class Ob
{
    private:
        int a = 0;

和。。。

Ob::increase(){ this->a++; }

但是a仅在内部循环中增加,如果调用 10 次 canot 保留最后一个值。

如何保持对象的上下文?

for (Ob obj : objs)

这将在每个循环迭代中创建一个副本,并在循环迭代完成后将其丢弃。

您希望改用引用:

for (Ob& obj : objs)

您是通过值传递(即复制列表中的对象并对其进行修改(,而不是通过引用传递(这意味着修改列表中的实际项目(。请参阅下面的简单程序来说明这一点

#include <list>
#include <iostream>
class Obj
{
public:
    void increase() { count++; }
    void printCount() { std::cout << count << 'n'; }
private:
    int count = 0;
};
int main()
{
    {
        std::list<Obj> passByValueObjs;
        Obj obj;
        passByValueObjs.push_back(obj);
        for (Obj obj : passByValueObjs)
        {
            obj.increase();
        }
        for (Obj obj : passByValueObjs)
        {
            obj.printCount();
        }
    }
    {
        std::list<Obj> passByReferenceObjs;
        Obj obj;
        passByReferenceObjs.push_back(obj);
        for (Obj &obj : passByReferenceObjs)
        {
            obj.increase();
        }
        for (Obj obj : passByReferenceObjs)
        {
            obj.printCount();
        }
    }
    return 0;
}

您正在修改对象的副本。

改变

for (Ob obj : objs)

for (Ob &obj : objs)