2

我正在尝试有效地复制跨度数据。考虑以下函数签名

void foo(Array& input, Buffer& U, Buffer& V)

其中 Buffer 和 Array 是

using Buffer = std::vector<uint8_t>;
using Array = std::valarray<uint8_t>;

现在,根据输入的常量,我可以切片valarray并得到另一个valarrayor 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));
}

我做错了什么?

4

0 回答 0