Yaml-cpp(新API) -嵌套映射/序列组合和迭代
Yaml-cpp (new API) - nested map / sequence combinations and iteration
我有相当基本的问题与这个api的处理映射与序列。假设我有以下结构:
foo_map["f1"] = "one";
foo_map["f2"] = "two";
bar_map["b1"] = "one";
bar_map["b2"] = "two";
我希望将其转换为以下YAML文件:
Node:
- Foo:
f1 : one
f2 : two
- Bar:
b1 : one
b2 : two
我可以这样做:
node.push_back("Foo");
node["Foo"]["b1"] = "one";
...
node.push_back("Bar");
然而,在最后一行节点现在已经从序列转换为映射,我得到一个异常。我能做到这一点的唯一方法是输出map的map:
Node:
Foo:
f1 : one
f2 : two
Bar:
b1 : one
b2 : two
这样做的问题是如果我不能读回这样的文件。如果我对Node进行迭代,我甚至无法在不得到异常的情况下获得节点迭代器的类型。
YAML::Node::const_iterator n_it = node.begin();
for (; n_it != config.end(); n_it++) {
if (n_it->Type() == YAML::NodeType::Scalar) {
// throws exception
}
}
这应该是非常简单的处理,但一直让我发疯!
YAML文件
Node:
- Foo:
f1 : one
f2 : two
- Bar:
b1 : one
b2 : two
可能不是您所期望的。它是一个映射,只有一个键/值对;键为Node
,值为序列;该序列的每一项都是一个包含三个键/值对的映射,并且与之相关联的值(例如Foo
)为空。最后一部分可能不是你所期望的。我猜你想要更像你实际得到的东西,即:
Node:
Foo:
f1 : one
f2 : two
Bar:
b1 : one
b2 : two
现在的问题是如何解析这个结构。
YAML::Node root = /* ... */;
YAML::Node node = root["Node"];
// We now have a map node, so let's iterate through:
for (auto it = node.begin(); it != node.end(); ++it) {
YAML::Node key = it->first;
YAML::Node value = it->second;
if (key.Type() == YAML::NodeType::Scalar) {
// This should be true; do something here with the scalar key.
}
if (value.Type() == YAML::NodeType::Map) {
// This should be true; do something here with the map.
}
}
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 将多个 for 循环组合成单个迭代器
- 通过字符串迭代并将每个循环中的先前字符组合在一起
- 实现迭代器,以许多向量的组合
- 如何编写一个迭代器包装器来组合底层迭代器中的顺序值组
- 根据运行时决策组合不同的迭代器
- 如何在C++11中编写一个简单的、类型擦除的可组合迭代器
- 比迭代所有组合更简单的解决方案
- Yaml-cpp(新API) -嵌套映射/序列组合和迭代