Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于字符串中的变量名分配值_C++ - Fatal编程技术网

C++ 基于字符串中的变量名分配值

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)的第一个值,并将其分配

奇怪的问题,很难说,但假设我有一个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)的第一个值,并将其分配给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等实际上是配置值,我建议您编写一个能够处理任意字符串/名称的通用可用类。示例: