如何使用std::ranges拼接视图,替代ranges-v3的views::concat功能?
std::ranges 拼接两个视图的解决方案
问题根因
std::ranges::views::concat是C23才正式加入标准库的特性,C20版本的标准库没有提供该接口,这是你从ranges-v3切换到标准库后concat失效的核心原因。join视图无法直接使用的原因:join的作用是拉平嵌套的区间结构(例如将[[a,b],[c,d]]转为[a,b,c,d]),不支持直接拼接两个独立的平级视图。
方案1:使用C++23(推荐)
如果你的编译器支持C++23(GCC 12+, Clang 16+, MSVC 2022 17.4及以上版本),直接使用标准库自带的concat即可,修改后的代码如下:
#include <string> #include <iostream> #include <ranges> using namespace std; using namespace views; void snake_to_camel() { auto const s = string{"feel_the_force"}; auto words = s | split('_'); auto words_cap = words | transform([](auto word){ auto head = word | take(1) | transform([](unsigned char c){return toupper(c);}); auto tail = word | drop(1); return concat(head, tail); }); auto s_camelcase = words_cap | join; string res(s_camelcase.begin(), s_camelcase.end()); cout << res; } int main() { snake_to_camel(); cout << endl; }
运行后输出为FeelTheForce,符合预期。
方案2:C++20兼容实现
如果暂时无法升级到C++23,你当前的蛇形转驼峰场景可以不用依赖视图拼接,直接构造临时字符串处理即可,逻辑更直观:
#include <string> #include <iostream> #include <ranges> using namespace std; using namespace views; void snake_to_camel() { auto const s = string{"feel_the_force"}; auto words = s | split('_'); auto words_cap = words | transform([](auto word){ string w(word.begin(), word.end()); w[0] = toupper(static_cast<unsigned char>(w[0])); return w; }); auto s_camelcase = words_cap | join; string res(s_camelcase.begin(), s_camelcase.end()); cout << res; } int main() { snake_to_camel(); cout << endl; }
内容的提问来源于stack exchange,提问作者Generic Name
相关产品推荐
相关产品推荐

