我正在寻找类似于memcpy的现有函数,可以告诉它复制x字节,然后跳过y字节,重复执行直到复制了指定的数量。
想象一下一个带有数据的缓冲区:AABAAB
(我使用过字符,但是我要处理的数据不是字符串数据)。
当应用于此缓冲区并告知其复制2个字节并跳过1个字节时,目标缓冲区将包含:AAAA
。
通过STL和Boost,我没有发现任何东西,但我希望其中任何一个都可以错过。
也许有一种聪明的(而不是讨厌的)方式使用更常见的功能来实现相同的目的。
最佳答案
您可能需要查看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个元素):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));
live example;