C++ 使用std::valarray和std::slice复制跨行数据

C++ 使用std::valarray和std::slice复制跨行数据,c++,stl,stdvector,valarray,range-v3,C++,Stl,Stdvector,Valarray,Range V3,我正在努力高效地复制跨越的数据。考虑以下函数签名< /P> void foo(Array& input, Buffer& U, Buffer& V) 其中缓冲区和数组是 using Buffer = std::vector<uint8_t>; using Array = std::valarray<uint8_t>; 然而,这种实现比仅仅在输入上循环并通过索引分配值要慢 顺便说一句,我不一定要使用valarray,以防您对使用哪个容器有更好的想

我正在努力高效地复制跨越的数据。考虑以下函数签名< /P>
void foo(Array& input, Buffer& U, Buffer& V)
其中缓冲区和数组是

using Buffer = std::vector<uint8_t>;
using Array = std::valarray<uint8_t>;
然而,这种实现比仅仅在输入上循环并通过索引分配值要慢

顺便说一句,我不一定要使用valarray,以防您对使用哪个容器有更好的想法

EDIT001:再想一想,Range-V3在这种情况下可能很方便,它的
ranges::V3::view::stride
,但是我找不到任何关于如何使用它的示例


EDIT002:已成功使范围工作。它非常慢,比简单for循环慢20倍

void foo(Buffer& input, Buffer& U, Buffer& V)
{
    V = ranges::move(input | ranges::v3::view::slice(0ull, input.size()) | ranges::v3::view::stride(2));
    U = ranges::move(input | ranges::v3::view::slice(1ull, input.size()) | ranges::v3::view::stride(2));
}
我做错了什么

void foo(Buffer& input, Buffer& U, Buffer& V)
{
    V = ranges::move(input | ranges::v3::view::slice(0ull, input.size()) | ranges::v3::view::stride(2));
    U = ranges::move(input | ranges::v3::view::slice(1ull, input.size()) | ranges::v3::view::stride(2));
}