range-v3:使用定界符连接管道范围
range-v3: Joining piped ranges with a delimeter
我正在尝试构建 range-v3 库的基本演示:取一些整数,过滤掉奇数,将它们字符串化,然后将它们加入逗号分隔的列表中。例如,{ 8, 6, 7, 5, 3, 0, 9 }
变为 "8, 6, 0"
。通过阅读 docs 并通过示例,天真的解决方案似乎类似于:
string demo(const vector<int>& v)
{
return v |
ranges::view::filter([](int i) { return i % 2 == 0; }) |
ranges::view::transform([](int i) { return to_string(i); }) |
ranges::view::join(", ");
}
但是在 Clang 7 上构建失败,静态断言 "Cannot get a view of a temporary container"。因为我将结果收集到一个字符串中,所以我可以使用急切的版本 - action::join
- 而不是:
string demo(const vector<int>& v)
{
return v |
ranges::view::filter([](int i) { return i % 2 == 0; }) |
ranges::view::transform([](int i) { return to_string(i); }) |
ranges::action::join;
}
但是 eager 版本似乎没有带分隔符的重载。
有趣的是,如果您先将 join
的输入收集到容器中,原始断言就会消失。以下编译并运行良好:
string demo(const vector<int>& v)
{
vector<string> strings = v |
ranges::view::filter([](int i) { return i % 2 == 0; }) |
ranges::view::transform([](int i) { return to_string(i); });
return strings | ranges::view::join(", ");
}
但这完全违背了驱动如此多库的惰性计算原则。
为什么第一个例子失败了?如果不可行,能否给action::join
一个分隔符?
action::join
应该接受分隔符。请随时提交功能请求。这些行动需要很多爱。
我正在尝试构建 range-v3 库的基本演示:取一些整数,过滤掉奇数,将它们字符串化,然后将它们加入逗号分隔的列表中。例如,{ 8, 6, 7, 5, 3, 0, 9 }
变为 "8, 6, 0"
。通过阅读 docs 并通过示例,天真的解决方案似乎类似于:
string demo(const vector<int>& v)
{
return v |
ranges::view::filter([](int i) { return i % 2 == 0; }) |
ranges::view::transform([](int i) { return to_string(i); }) |
ranges::view::join(", ");
}
但是在 Clang 7 上构建失败,静态断言 "Cannot get a view of a temporary container"。因为我将结果收集到一个字符串中,所以我可以使用急切的版本 - action::join
- 而不是:
string demo(const vector<int>& v)
{
return v |
ranges::view::filter([](int i) { return i % 2 == 0; }) |
ranges::view::transform([](int i) { return to_string(i); }) |
ranges::action::join;
}
但是 eager 版本似乎没有带分隔符的重载。
有趣的是,如果您先将 join
的输入收集到容器中,原始断言就会消失。以下编译并运行良好:
string demo(const vector<int>& v)
{
vector<string> strings = v |
ranges::view::filter([](int i) { return i % 2 == 0; }) |
ranges::view::transform([](int i) { return to_string(i); });
return strings | ranges::view::join(", ");
}
但这完全违背了驱动如此多库的惰性计算原则。
为什么第一个例子失败了?如果不可行,能否给action::join
一个分隔符?
action::join
应该接受分隔符。请随时提交功能请求。这些行动需要很多爱。