Я изучаю базовое использование range-v3 (https://github.com/ericniebler/range-v3).
Когда я использую view :: tokenize для «разбора» некоторого вектора строк, некоторые совпадения не совпадают с окончательным результатом, но внутри функции преобразования вывод верен, даже когда я возвращаю то же представление, что и я м в конце.
Я проверял это с 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]]
Я ожидал, что представления, помеченные * (напечатанные при возврате из функции преобразования), будут идентичны представлениям в следующей строке.