我正在寻找一个类似于memcpy的现有函数,可以告诉他复制 x 字节,然后跳过 y 字节,重复直到指定的数量为止被复制了。
想象一下包含数据的缓冲区:AABAAB
(我使用了字符,但我操作的数据不是字符串数据)。
当应用于此缓冲区并被告知复制2个字节并跳过1个字节时,目标缓冲区将包含:AAAA
。
我还没有找到任何关于STL和Boost的内容,但我希望其中有一些我错过了。
或许还有一种聪明(而不是讨厌)的方法,可以使用更常见的功能来实现同样的目标。
答案 0 :(得分:2)
您可能需要查看boost::adaptors::strided
。
你可能会写这样的东西:
boost::copy(boost::make_iterator_range(in, in+size) | boost::adaptors::strided(2), out);
虽然这会产生大量的程序集,但编译器似乎也可以完全内联:compiler explorer example。
要删除每个第n个元素,您还可以使用不允许每个第n个元素的谓词来求boost::adaptors::filtered
(strided
执行相反的操作,保持每个第n个元素):< / p>
char const* input = "AABAAB";
unsigned counter{};
auto pred = [&counter](auto const&){ return ++counter % 3; };
boost::copy(boost::make_iterator_range(input, input+strlen(input)) | boost::adaptors::filtered(pred),
std::ostream_iterator<char>(cout));
答案 1 :(得分:0)
似乎没有直接相当于memcpy来做我想要的事情。 Boost似乎经常有一些有用的辅助函数,但我最终实现了一个简单的循环函数来完成这项工作,因为它似乎是最简单的&amp;适当的解决方案。