C++中,ranges::elements_of(ranges::iota_view(0, 11)); }() | ranges::reverse_view() | ranges::to()
我需要使用生成器来生成一个递减序列。下面是我尝试的:
vector<size_t> data = []() -> generator<size_t>
{ co_yield ranges::elements_of(ranges::iota_view(0, 11)); }() | ranges::reverse_view() | ranges::to<vector>()
它提示缺少 reverse_view() 参数。错误:
2457 | { co_yield ranges::elements_of(ranges::iota_view(0, 11)); }() | ranges::reverse_view() | ranges::to<vector>();
| ^
Console.cpp:2457:94: error: no matching function for call to ‘reverse_view()’
这次对我来说可行的是:
[]() -> generator<size_t>{ co_yield ranges::elements_of(ranges::reverse_view(ranges::iota_view(0, 11))); }() | ranges::to<vector>()
我需要一个用于GoogleTest的生成器:
INSTANTIATE_TEST_SUITE_P(
MyTests,
MyTestFixture,
::testing::Values(make_tuple(1, vector<size_t>{0}),
make_tuple(1, []() -> generator<size_t>
{ co_yield ranges::elements_of(ranges::reverse_view(ranges::iota_view(0, 11))); }() | ranges::to<vector>())));
解决方案
即使修正使用 reverse_view 的语法,无论是 generator | std::views::reverse 还是 std::ranges::reverse_view(generator),你也会遇到编译错误。
你不能反转一个 std::generator,因为它并不建模 std::ranges::bidirectional_range。std::generator 是一个单次遍历、前向的范围。
在这里你还没有展示任何需要 std::generator 的情况。
std::vector<std::size_t> decreasing(std::size_t size) {
return std::views::iota(0z, size) | std::views::reverse | std::ranges::to<std::vector>();
}
INSTANTIATE_TEST_SUITE_P(
MyTests,
MyTestFixture,
::testing::Values(make_tuple(1, decreasing(1)),
make_tuple(1, decreasing(11))));
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。