我正在努力有效地复制stridden数据。请考虑以下函数签名
void foo(Array& input, Buffer& U, Buffer& V)
缓冲区和数组
using Buffer = std::vector<uint8_t>;
using Array = std::valarray<uint8_t>;
现在,根据输入的常量,我可以对valarray
进行切片并获得另一个valarray
或slice_array
。切片valarray
会损害性能(复制)。有没有办法使用slice_array
复制切片数据?
我天真的实施
void foo(Array& input, Buffer& U, Buffer& V)
{
Array Uslice = input[std::slice(0, input.size() / 2, 2)];
Array Vslice = input[std::slice(0 + 1, input.size() / 2, 2)];
std::copy(std::begin(Uslice), std::end(Uslice), U.begin());
std::copy(std::begin(Vslice), std::end(Vslice), V.begin());
}
但是,这种实现比仅循环输入和按索引分配值要慢。
顺便说一下,我不一定要使用valarray,以防你有更好的想法使用什么容器 EDIT001:第二个想法,Range-V3在这种情况下可能很方便,有ranges::v3::view::stride
,但是我找不到任何如何使用它的例子
EDIT002:管理范围工作。它非常慢,比简单的循环慢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));
}
我做错了什么?