gpt4 book ai didi

c++ - range-v3:使用定界符连接管道范围

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:26 28 4
gpt4 key购买 nike

我正在尝试构建 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 的构建失败并出现静态断言“无法获取临时容器的 View ”。因为我正在将结果收集到一个字符串中,所以我可以使用急切的版本 - 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 应该接受一个分隔符。请随时提交功能请求。这些行动需要很多爱。

关于c++ - range-v3:使用定界符连接管道范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55386500/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com