使用std :: valarray和std :: slice复制stridden数据

时间:2017-05-20 07:21:16

标签: c++ stl stdvector valarray range-v3

我正在努力有效地复制stridden数据。请考虑以下函数签名

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

缓冲区和数组

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

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

我做错了什么?

0 个答案:

没有答案