如何在循环中改变容器中的元素
How do I mutate elements in a container in a loop?
有一个对象列表,并按每个对象调用一个函数,但不能保留上下文,例如:
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)
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 如何在循环中改变容器中的元素
- 改变vs中持续char*的元素
- 一个元素不能改变的非守恒向量
- 提升::p tr_向量改变元素顺序
- 为什么我的循环范围不会改变元素?
- 如果vector改变,迭代器是否指向相同的元素?或者怎么做
- 一些向量元素不会改变
- 改变一个MFC对话框元素的背景颜色
- 不能改变Cocos2d-x MenuItemToggle元素的不透明度
- 为什么矢量不改变其元素?
- 如何用键盘改变glLookat视图元素的整数值
- std::list会改变元素在内存中的位置吗?
- 在不改变索引顺序的情况下从动态数组中删除元素
- 如何洗牌一个数组,使所有元素改变它们的位置
- 在c++中,如何改变元素在一个向量中的位置,并对另一个不同的向量进行相同的改变