yaml-cpp 到 std::vector 迭代奇怪的行为
yaml-cpp to std::vector iteration weird behaviour
我在阅读 yaml 文件时发现了一些(在我看来)相当奇怪的东西。也许你们中的一位可以向我解释这两个代码之间的区别。
我尝试读取的 yaml 文件看起来像这样:
map:
- [0 0 0 0]
- 0:
- 0.123
- 1:
- -0.234
- [0 0 0 1]
- 0:
- 0.00
- 1:
- 1.234
# and many more vector to int to doubles.
现在我正在尝试将其读入std::map<std::vector<int>, std::map<int, double> >
供以后使用。
我尝试使用来自 yaml-cpp 的 STL 转换来做到这一点:
std::map<std::vector<int>, std::map<int, double> > the_map = node.as<std::map<std::vector<int>, std::map<int, double> > >();
但是因为这不起作用(现在没有错误消息,但这并不是问题的真正含义,只是作为解释)我写了我自己的读取例程,如下所示:
YAML::Node node = YAML::LoadFile(name);
for(YAML::const_iterator n = node["map"].begin(); n != node["map"].end(); ++n){
auto n_0 = (*n).begin();
for(auto it = n_0->first.as<std::vector<int> >().begin(); it != n_0->first.as<std::vector<int> >().end(); ++it){
std::cout << *it << " ";
}
// Some more stuff
}
它会导致一些奇怪的输出:
937068720 21864 0 0
937068720 21864 0 1
但是,如果我将其更改为以下代码:
YAML::Node node = YAML::LoadFile(name);
for(YAML::const_iterator n = node["map"].begin(); n != node["map"].end(); ++n){
auto n_0 = (*n).begin();
std::vector<int> vec = n_0->first.as<std::vector<int> >();
for(auto it = vec.begin(); it != vec.end(); ++it){
std::cout << *it << " ";
}
// Some more stuff
}
一切如预期:
0 0 0 0
0 0 0 1
两者有什么区别?为什么我必须特别声明向量?
即使在 .begin()
之前用括号括起来也没有什么区别。像这样:
for(auto it = (n_0->first.as<std::vector<int> >()).begin(); it != (n_0->first.as<std::vector<int> >()).end(); ++it)
有人可以给我解释一下吗?第一个和第二个代码有什么区别?
由于我是 YAML 的新手,所以我很高兴收到任何关于阅读此类文件的改进建议,但这不是我最关心的问题。
您的 YAML 无效!参见,例如 online parser;并且 yaml-cpp
同意:运行 效用函数 util/parse
与您的 YAML 给出:
yaml-cpp: error at line 3, column 5: end of sequence not found
也许你的意思是这样的:
map:
[0 0 0 0]:
- 0:
- 0.123
- 1:
- -0.234
[0 0 0 1]:
- 0:
- 0.00
- 1:
- 1.234
这至少是有效的 YAML,但它可能不是您期望的格式。分析如下:
map: // map of string ->
[0 0 0 0]: // map of vector of int ->
- 0: // vector of map of int to ->
- 0.123 // vector of double
- 1:
- -0.234
[0 0 0 1]:
- 0:
- 0.00
- 1:
- 1.234
在标准库函数中,这将是一个
std::map<string, std::map<std::vector<int>, std::vector<std::map<int, std::vector<double>>>>>
我在阅读 yaml 文件时发现了一些(在我看来)相当奇怪的东西。也许你们中的一位可以向我解释这两个代码之间的区别。
我尝试读取的 yaml 文件看起来像这样:
map:
- [0 0 0 0]
- 0:
- 0.123
- 1:
- -0.234
- [0 0 0 1]
- 0:
- 0.00
- 1:
- 1.234
# and many more vector to int to doubles.
现在我正在尝试将其读入std::map<std::vector<int>, std::map<int, double> >
供以后使用。
我尝试使用来自 yaml-cpp 的 STL 转换来做到这一点:
std::map<std::vector<int>, std::map<int, double> > the_map = node.as<std::map<std::vector<int>, std::map<int, double> > >();
但是因为这不起作用(现在没有错误消息,但这并不是问题的真正含义,只是作为解释)我写了我自己的读取例程,如下所示:
YAML::Node node = YAML::LoadFile(name);
for(YAML::const_iterator n = node["map"].begin(); n != node["map"].end(); ++n){
auto n_0 = (*n).begin();
for(auto it = n_0->first.as<std::vector<int> >().begin(); it != n_0->first.as<std::vector<int> >().end(); ++it){
std::cout << *it << " ";
}
// Some more stuff
}
它会导致一些奇怪的输出:
937068720 21864 0 0
937068720 21864 0 1
但是,如果我将其更改为以下代码:
YAML::Node node = YAML::LoadFile(name);
for(YAML::const_iterator n = node["map"].begin(); n != node["map"].end(); ++n){
auto n_0 = (*n).begin();
std::vector<int> vec = n_0->first.as<std::vector<int> >();
for(auto it = vec.begin(); it != vec.end(); ++it){
std::cout << *it << " ";
}
// Some more stuff
}
一切如预期:
0 0 0 0
0 0 0 1
两者有什么区别?为什么我必须特别声明向量?
即使在 .begin()
之前用括号括起来也没有什么区别。像这样:
for(auto it = (n_0->first.as<std::vector<int> >()).begin(); it != (n_0->first.as<std::vector<int> >()).end(); ++it)
有人可以给我解释一下吗?第一个和第二个代码有什么区别?
由于我是 YAML 的新手,所以我很高兴收到任何关于阅读此类文件的改进建议,但这不是我最关心的问题。
您的 YAML 无效!参见,例如 online parser;并且 yaml-cpp
同意:运行 效用函数 util/parse
与您的 YAML 给出:
yaml-cpp: error at line 3, column 5: end of sequence not found
也许你的意思是这样的:
map:
[0 0 0 0]:
- 0:
- 0.123
- 1:
- -0.234
[0 0 0 1]:
- 0:
- 0.00
- 1:
- 1.234
这至少是有效的 YAML,但它可能不是您期望的格式。分析如下:
map: // map of string ->
[0 0 0 0]: // map of vector of int ->
- 0: // vector of map of int to ->
- 0.123 // vector of double
- 1:
- -0.234
[0 0 0 1]:
- 0:
- 0.00
- 1:
- 1.234
在标准库函数中,这将是一个
std::map<string, std::map<std::vector<int>, std::vector<std::map<int, std::vector<double>>>>>