我在这个 api 处理 map 与序列的过程中遇到了一些非常基本的问题。假设我有以下结构:
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
可能不是您所期望的。它是一张 map ,只有一个键/值对;键是Node
,值是一个序列;该序列的每个条目都是一个具有三个键/值对 的映射,并且与例如Foo
关联的值是null。最后一部分可能不是您所期望的。我猜你想要更像你实际得到的东西,即:
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.
}
}
关于c++ - Yaml-cpp(新 API)——嵌套映射/序列组合和迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22504708/