Range-v3 view::sliding(n) 到 return 元组(如果 n 在编译时已知)
Range-v3 view::sliding(n) to return tuple (if n known at compile time)
std::vector v{1,2,3};
for (auto&& t : v | view::sliding(2)) {
auto&& [first, second] = t; // error - t is a range
}
range-v3 中是否有类似的视图可以 return 一个元组?
类似于sliding<2>
假设这不是您想要的,但您可以这样写:
template <typename T, size_t... I>
auto helper(T&& rng, std::index_sequence<I...>) {
return std::make_tuple(rng[I]...);
}
int main() {
std::vector v{1,2,3,4,5};
for (auto&& t : v | ranges::view::sliding(3)) {
auto&& [first, second, third] = helper(t, std::make_index_sequence<3>{});
std::cout << first << ", " << second << ", " << third << std::endl;
}
}
否则,我不知道如何制作编译时大小范围。
对于 [1,n)
(DEMO) 中的所有 i
,您可以 zip
和 drop(range, i)
一起 range
:
std::vector v{1,2,3};
namespace view = ranges::view;
for (auto [first, second] : view::zip(v, view::drop(v, 1))) {
std::cout << first << ", " << second << '\n';
}
对于更大的 n
,这将很快变得丑陋,并且几乎肯定不是最佳的,但比编写自己的视图适配器要简单得多。
std::vector v{1,2,3};
for (auto&& t : v | view::sliding(2)) {
auto&& [first, second] = t; // error - t is a range
}
range-v3 中是否有类似的视图可以 return 一个元组?
类似于sliding<2>
假设这不是您想要的,但您可以这样写:
template <typename T, size_t... I>
auto helper(T&& rng, std::index_sequence<I...>) {
return std::make_tuple(rng[I]...);
}
int main() {
std::vector v{1,2,3,4,5};
for (auto&& t : v | ranges::view::sliding(3)) {
auto&& [first, second, third] = helper(t, std::make_index_sequence<3>{});
std::cout << first << ", " << second << ", " << third << std::endl;
}
}
否则,我不知道如何制作编译时大小范围。
对于 [1,n)
(DEMO) 中的所有 i
,您可以 zip
和 drop(range, i)
一起 range
:
std::vector v{1,2,3};
namespace view = ranges::view;
for (auto [first, second] : view::zip(v, view::drop(v, 1))) {
std::cout << first << ", " << second << '\n';
}
对于更大的 n
,这将很快变得丑陋,并且几乎肯定不是最佳的,但比编写自己的视图适配器要简单得多。