如何通过C++23 ranges::elements_of拼接多个iota_view生成数字序列?
C++23生成器实现双范围拼接的修改方案
首先修正你代码里的问题,同时完成双范围拼接的需求:
完整修改后的代码
#include <generator> #include <ranges> std::generator<size_t> GenerateSequence(size_t start1, size_t end1, size_t start2, size_t end2) { // 生成第一组连续序列:[start1, end1) co_yield std::ranges::elements_of(std::ranges::iota_view{start1, end1}); // 生成第二组连续序列:[start2, end2) co_yield std::ranges::elements_of(std::ranges::iota_view{start2, end2}); }
关键修改点说明
- 修正参数名错误:原代码误用了
start和end,替换为函数参数对应的start1、end1,确保第一组范围正确。 - 添加第二组范围的生成逻辑:新增一条
co_yield std::ranges::elements_of(...)语句,传入第二个iota_view即可实现两个范围的拼接——生成器会按顺序输出第一组所有元素,再输出第二组所有元素。 - 调整generator的模板参数:原代码用
const size_t&存在悬空引用风险,iota_view生成的是临时值,返回引用会导致调用方访问无效内存。改为直接返回size_t值类型,符合C++23生成器的最佳实践。
使用示例
你可以这样调用验证效果:
#include <iostream> int main() { for (auto num : GenerateSequence(1, 4, 6, 9)) { std::cout << num << ' '; } // 输出:1 2 3 6 7 8 return 0; }
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

