如何用循环批量处理C++类实例?vector使用遇阻求助
问题描述
现有如下C++代码:
[...] class klasse{ public: int Var1; int Var2; }; klasse Klasse1; klasse Klasse2; klasse Klasse3; Klasse1.Var1=1; Klasse2.Var1=1; Klasse3.Var1=1; //now watch if(Klasse1.Var1==1) { Klasse1.Var2=1; } if(Klasse2.Var1==1) { Klasse2.Var2=1; } if(Klasse2.Var1==1) { Klasse2.Var2=1; }
当前需要逐个判断klasse类实例的Var1,若值为1则将对应实例的Var2设为1,重复代码冗余。希望通过类似数组下标的for循环批量处理这些类实例,期望实现如下效果:
[...] class klasse{ public: int Var1; int Var2; }; klasse Klasse1; klasse Klasse2; klasse Klasse3; Klasse1.Var1=1; Klasse2.Var1=1; Klasse3.Var1=1; for(int i=0; i<3; i++) { if(Klasse[i].Var1==1) { Klasse[i].Var2=1; } }
尝试使用vector实现但未达到预期效果,请求正确的实现方案。
实现方案
方法1:用数组存储现有实例的指针/引用
如果要保留已定义的单个实例(Klasse1、Klasse2、Klasse3),可以把它们的指针或引用存入数组,直接通过下标循环操作原实例:
class klasse{ public: int Var1; int Var2; }; klasse Klasse1; klasse Klasse2; klasse Klasse3; // 存储实例指针的数组 klasse* KlasseArr[] = {&Klasse1, &Klasse2, &Klasse3}; Klasse1.Var1=1; Klasse2.Var1=1; Klasse3.Var1=1; for(int i=0; i<3; i++) { if(KlasseArr[i]->Var1 == 1) { KlasseArr[i]->Var2 = 1; } }
如果想用引用数组(语法上需初始化时绑定):
class klasse{ public: int Var1; int Var2; }; klasse Klasse1; klasse Klasse2; klasse Klasse3; // 存储实例引用的数组 klasse& KlasseArr[] = {Klasse1, Klasse2, Klasse3}; Klasse1.Var1=1; Klasse2.Var1=1; Klasse3.Var1=1; for(int i=0; i<3; i++) { if(KlasseArr[i].Var1 == 1) { KlasseArr[i].Var2 = 1; } }
方法2:正确使用vector实现
如果倾向于用vector,有两种可行思路:
- 直接在vector中创建实例,后续操作vector内的元素:
#include <vector> class klasse{ public: int Var1; int Var2; }; // 初始化包含3个实例的vector std::vector<klasse> KlasseVec(3); // 批量设置Var1的值 for(int i=0; i<KlasseVec.size(); i++) { KlasseVec[i].Var1 = 1; } // 批量处理Var2 for(int i=0; i<KlasseVec.size(); i++) { if(KlasseVec[i].Var1 == 1) { KlasseVec[i].Var2 = 1; } }
- 保留原有单个实例,将实例指针存入vector:
#include <vector> class klasse{ public: int Var1; int Var2; }; klasse Klasse1; klasse Klasse2; klasse Klasse3; std::vector<klasse*> KlasseVec; KlasseVec.push_back(&Klasse1); KlasseVec.push_back(&Klasse2); KlasseVec.push_back(&Klasse3); Klasse1.Var1=1; Klasse2.Var1=1; Klasse3.Var1=1; // 用范围for循环简化批量处理(C++11及以上支持) for(auto ptr : KlasseVec) { if(ptr->Var1 == 1) { ptr->Var2 = 1; } }
方法3:直接定义数组实例
如果不需要单独命名的实例,可以直接定义数组,从源头避免冗余:
class klasse{ public: int Var1; int Var2; }; // 直接创建包含3个实例的数组 klasse KlasseArr[3]; // 批量初始化Var1 for(int i=0; i<3; i++) { KlasseArr[i].Var1 = 1; } // 批量处理Var2 for(int i=0; i<3; i++) { if(KlasseArr[i].Var1 == 1) { KlasseArr[i].Var2 = 1; } }
内容的提问来源于stack exchange,提问作者Hunor Holzinger
相关产品推荐
相关产品推荐

