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

时间:2018-01-16 21:04:33

标签: c++

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

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

increase()函数与本地var相加,例如:

class Ob
{
    private:
        int a = 0;

而且......

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

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

如何保持对象的上下文?

3 个答案:

答案 0 :(得分:6)

for (Ob obj : objs)

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

您想要使用引用:

for (Ob& obj : objs)

答案 1 :(得分:2)

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

#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;
}

答案 2 :(得分:1)

您正在修改该对象的副本。

更改

for (Ob obj : objs)

for (Ob &obj : objs)