首页 > 解决方案 > 一天中的月份,其中一个 for 循环或 range-v3 lib 中的序列

问题描述

我尝试用这样的顺序来计算一天中的月份:一月份它将打印 1 和 31 时间,二月份将打印 2 和 28 时间,依此类推。

std::vector<int> list = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int count = 0;
for(int k = 0; k < 12; k++){
   for(int i = 0; i < list[k]; i++)
       cout << count + 1;
   count++;
}

list 保留当月的总天数。

我可以用这个 for 循环来做,但我想在 1 个循环或 range-v3 lib 中做。在 range-v3 lib 中,我尝试使用累积功能,但我做不到。

任何想法?

标签: c++rangec++20range-v3

解决方案


使用 range-v3,您可以执行以下操作:

std::array<int, 12> days{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

auto r = days | ranges::view::transform([count = 0](int n) mutable
                {
                    return ranges::view::ints(1, 1 + n)
                         | ranges::view::transform([count = ++count](int){ return count; });
                })
              | ranges::view::join;

for (auto e : r) 
    std::cout << e << ' ';

演示

for (int i = 0; i < 12; ++i) {
   for (int j = 0; j != days[i]; ++j) {
       std::cout << i + 1;
   }
}

似乎更清楚。


推荐阅读