我正在尝试有效地复制跨度数据。考虑以下函数签名
void foo(Array& input, Buffer& U, Buffer& V)
其中 Buffer 和 Array 是
using Buffer = std::vector<uint8_t>;
using Array = std::valarray<uint8_t>;
现在,根据输入的常量,我可以切片valarray
并得到另一个valarray
or 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:设法使范围工作。它非常慢,比简单的 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));
}
我做错了什么?