复制时跳过 x 字节的 memcpy 等效项(不仅仅是初始 x 字节)?

Posted

技术标签:

【中文标题】复制时跳过 x 字节的 memcpy 等效项(不仅仅是初始 x 字节)?【英文标题】:memcpy equivalent for skipping x bytes while copying (not just initial x bytes)? 【发布时间】:2016-09-27 08:00:12 【问题描述】:

我正在寻找一个类似于 memcpy 的现有函数,可以告诉它复制 x 个字节,然后跳过 y 个字节,重复直到复制了指定的数量.

想象一个带有数据的缓冲区:AABAAB(我使用了字符,但我操作的数据不是字符串数据)。

当应用于此缓冲区并被告知复制 2 个字节并跳过 1 个字节时,目标缓冲区将包含:AAAA

我没有通过 STL 和 Boost 找到任何东西,但我希望其中有一些我错过的东西。

或者也许有一个聪明的(而不是讨厌的)方法来使用更常见的功能来实现同样的事情。

【问题讨论】:

我不是 Boost 用户,但是在循环中使用 memcpy() 编写这不是很简单吗?您是否不再被允许用现代 C++ 编写新代码? :) 也许你可以使用std::copy_if 我希望能够利用一个经过优化的、经过测试的功能——我真的没有时间去实现......不过,如果涉及到它,那就是我必须要做。 您是在谈论原始数据还是字符串操作。 Memcpy() 应该适用于原始数据。但是,对于字符串等,您可以使用 std::transform(),您可以在其中定义 lambda 函数中的行为 @Dkg 原始数据 - 我会更新我的问题。 【参考方案1】:

您可能想查看boost::adaptors::strided

你可能会这样写:

boost::copy(boost::make_iterator_range(in, in+size) | boost::adaptors::strided(2), out);

虽然这会产生大量程序集,但编译器似乎也可以完美内联:compiler explorer example。

要删除每个第 n 个元素,您还可以使用 boost::adaptors::filtered 并使用一个禁止每个第 n 个元素的谓词(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;

【讨论】:

谢谢,这看起来很有希望 - 我是否正确假设我必须将我的数据存储在 STL 容器(如矢量)而不是普通数组中? 我认为它应该适用于由迭代器对组成的任何范围。我会更新一个例子。 @grae22 已更新,但我不再确定这是解决您的问题还是解决问题的最佳方法。 谢谢,看来我必须实现自己的功能 - 您建议的这些方法看起来可以很好地完成这项工作,所以我会试一试并报告。 谢谢 - 这是一个有趣的练习,可以让我更熟悉 boost,但最终我用一个简单的循环实现实现了我自己的函数。【参考方案2】:

似乎没有直接相当于 memcpy 来做我想做的事。 Boost 似乎经常提供一些有用的辅助函数,但我最终实现了一个简单的循环函数来完成这项工作,因为它似乎是最简单和合适的解决方案。

【讨论】:

以上是关于复制时跳过 x 字节的 memcpy 等效项(不仅仅是初始 x 字节)?的主要内容,如果未能解决你的问题,请参考以下文章

memcpy 仅通过 C++ 复制一个字节

C memcpy 以小字节序复制字节

/usr/bin/ld: 搜索 -lQtCore 时跳过不兼容的 /usr/lib/x86_64-linux-gnu/libQtCore.so

在搜索 -ldeepsort 时跳过不兼容的 ../tracker/libdeepsort.so

Rails:是不是有跳过 after_save 过滤器的 save_without_validation 等效项?

复制文件时显示文件过大,怎么回事?