C++ 与yaml cpp接口的数据结构设计提示?

C++ 与yaml cpp接口的数据结构设计提示?,c++,yaml,yaml-cpp,C++,Yaml,Yaml Cpp,我开始使用YAML和YAML cpp库来编辑我的文件。我用自己项目中的一些信息扩展了“怪物”示例。代码和yaml文件如下所示,但我首先提出一个问题: 是否有必要将我从项目中获取的所有数据放在一个庞大的结构中?在monsters示例中,从文档doc[i]读取中的值很容易,因为它是一个怪物列表。在我的示例中,我将有一些列表,但也有标量等。我发现实现这一点的唯一方法是创建一个从技术上讲只有一个条目的列表(即,文件顶部有一个“-”,所有内容都缩进到一个块中)。我认为答案是获取重载>>操作符的“probl

我开始使用YAML和YAML cpp库来编辑我的文件。我用自己项目中的一些信息扩展了“怪物”示例。代码和yaml文件如下所示,但我首先提出一个问题:

是否有必要将我从项目中获取的所有数据放在一个庞大的结构中?在monsters示例中,从文档doc[i]读取中的值很容易,因为它是一个怪物列表。在我的示例中,我将有一些列表,但也有标量等。我发现实现这一点的唯一方法是创建一个从技术上讲只有一个条目的列表(即,文件顶部有一个“-”,所有内容都缩进到一个块中)。我认为答案是获取重载>>操作符的“problemformulation”版本的一些内容,但如果没有该函数中的内容,我无法使其正常工作。任何帮助或建议都将不胜感激

ea_test.cpp:

    #include "yaml-cpp/yaml.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>

    struct Vec2{
  double x, y;
    };

    struct DecVar{
  std::string name;
  std::string tag;
      Vec2 range;
  std::string description;
    };

    struct ProblemFormulation{
  std::vector <DecVar> decvars;
  int numrealizations;
    };

    void operator >> (const YAML::Node& node, Vec2& v) {
  node[0] >> v.x;
  node[1] >> v.y;
    }

    void operator >> (const YAML::Node& node, DecVar& decvar){
  node["name"] >> decvar.name;
  node["tag"] >> decvar.tag;
      node["range"] >> decvar.range;
  node["description"] >> decvar.description;
    }

    void operator >> (const YAML::Node& node, ProblemFormulation& problemformulation){
      node["realizations"] >> problemformulation.numrealizations;
      std::cout << " read realizations!" << std::endl; 
      const YAML::Node& decvarNode = node["decisions"];
      for (unsigned int i = 0; i < decvarNode.size(); i++)
      {
    DecVar decvar;
    decvarNode[i] >> decvar;
        problemformulation.decvars.push_back(decvar);
      }
    }

    int main()
    {
        std::ifstream fin("./ea.yaml");
        YAML::Parser parser(fin);
        YAML::Node doc;
        parser.GetNextDocument(doc);
        std::cout << "entering loop" << std::endl;

        ProblemFormulation problemformulation;

        for (unsigned int i = 0; i < doc.size(); i++)
        {
              doc[i] >> problemformulation;
        }
        return 0;
    }
提前感谢您的帮助和提示

编辑:我可能只运行一个yaml文档,并且只会创建一个problemformulation对象。我的代码调整了列表的操作,但只执行一次。我想知道“只做一次”的正确方法,因为我认为这样做会更干净,使YAML文件看起来更好(没有任何原因,所有的东西都缩进一个块)。

当您编写

for (unsigned int i = 0; i < doc.size(); i++)
{
    doc[i] >> problemformulation;
}

谢谢你的帮助。我可能会有更多的问题,但稍后会将它们作为完整的、单独的帖子来写。
for (unsigned int i = 0; i < doc.size(); i++)
{
    doc[i] >> problemformulation;
}
doc >> problemformulation;