为什么范围(vdata)的输出没有给我完整的双打列表?

时间:2019-04-03 19:42:00

标签: c++ range

我正在学习range-v3(https://github.com/ericniebler/range-v3)的一些基本用法。

当我使用view :: tokenize来“解析”某些字符串向量时,某些匹配项从最终结果中消失了,但是在transform函数内部,输出是正确的,即使Im返回与我相同的视图m显示在末尾。

我用for_each和yield_from / yield进行了测试,结果相同。

在github页面上检查了实现的问题,但我没有发现与此相关的任何事情。

#include <iostream>
#include <range/v3/all.hpp>
#include <string>

int main() {
  std::vector<std::string> data = {{"1.1;2.2;3.3;4.4;5.5;6.6"},
                                   {"0.1;0.2;0.3;0.4;0.5;0.6"},
                                   {".1;.2;.3;.4;.5;.6"}};

  auto rgx = std::regex{"[\\d]*[.][\\d]+"};

  auto to_double = [](auto a) { return stod(a.str()); };

  auto vdata = data | ranges::view::transform([&](auto s) {
                 auto p = s | ranges::view::tokenize(rgx) |
                          ranges::view::transform(to_double);
                 std::cout << "\n" << p << "*\n";
                 return p;
               });

  std::cout << vdata;

  return 0;
}

输出:

$ clang++ -std=c++1z -I./deps/range-v3/include -O0 -g src/main.cpp -o mil 
$ ./mil                                                                                                        
[
[1.1,2.2,3.3,4.4,5.5,6.6]*
[3.3,4.4,5.5,6.6],
[0.1,0.2,0.3,0.4,0.5,0.6]*
[0.3,0.4,0.5,0.6],
[0.1,0.2,0.3,0.4,0.5,0.6]*
[0.4,0.5,0.6]]                                                                                                                                                

我希望标有*(从转换函数返回时打印)的视图与下一行相同。

0 个答案:

没有答案