C++ 基于字符串中的变量名分配值
奇怪的问题,很难说,但假设我有一个2个文件,其中有一个字符串,上面的文件中会出现什么双变量,然后是相应的双变量,比如: 文件1=C++ 基于字符串中的变量名分配值,c++,C++,奇怪的问题,很难说,但假设我有一个2个文件,其中有一个字符串,上面的文件中会出现什么双变量,然后是相应的双变量,比如: 文件1= A B C D E 1.2 3.4 4.5 5.6 7.8 文件2= B D E 9.8 7.6 5.4 我有一个双重结构 struct numb{ double A,B,C,D,E}; 是否可以读入文件1中的字符串(A B C D E)以及字符串中的第一个值是什么(A)将其分配给相应的结构值numb.A 因此,下一个文件将读取字符串(B)的第一个值,并将其分配
A B C D E
1.2 3.4 4.5 5.6 7.8
文件2=
B D E
9.8 7.6 5.4
我有一个双重结构
struct numb{
double A,B,C,D,E};
是否可以读入文件1中的字符串(A B C D E)以及字符串中的第一个值是什么(A)将其分配给相应的结构值numb.A
因此,下一个文件将读取字符串(B)的第一个值,并将其分配给numb.B。
我意识到使用一堆if语句是可能的,但我想知道是否有更简单的方法。最难的部分是变量串总是A、B、C、D、E的组合。在C++中VS10程序> P> A<代码>开关< /代码>可能是最简单的方法。
void set_member(numb &n, char member, double value)
{
switch (member) {
case 'A':
n.A = value;
break;
case 'B':
n.B = value;
break;
// etc.
default:
// handle error
}
}
在
struct numb
中声明一个双精度数组
struct numb {
void setValue(char label, double val) { value[label-'A'] = val; }
double getValue(char label) const { return value[label-'A']; }
double value[5];
};
然后,您可以执行:
numb n;
n.setValue('A', 1.2);
double A = n.getValue('A');
您可以创建一个映射,将要解析的字符串作为键,将结构的相应属性的值作为值
std::map<std::string, double numb::*> mapLetterToCorrespondingAttribute;
std::将Mapletter映射到相应的属性;
然后解析您的文件,并将该值分配给对应的成员,该成员由映射中与您解析的字母对应的键所指向
在你说你不明白之前,先把这句话读几遍:D把这两行读成
std::vector
,然后把它们成对地放在地图上:
std::vector<std::string> vars; // the split up first line
std::vector<std::string> values; // split up second line
std::map<std::string, double> mapping;
for (int i = 0; i < vars.size(); ++i) {
mapping.insert(std::make_pair(vars[i], boost::lexical_cast<double>(values[i]));
}
std::vector vars;//第一行被分开
std::向量值;//分开第二行
地图映射;
对于(int i=0;i
如果您使用合理的默认值预先填充映射
映射
,这应该非常简单。此外,您可以使用任何您喜欢的转换方法替换对boost::lexical\u cast
的调用。一个很好的补充:在类中公开此映射,或者提供一个使用此映射进行实现的方法(甚至更好)。如果B C等实际上是配置值,我建议您编写一个能够处理任意字符串/名称的通用可用类。示例: