复制时跳过 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 字节)?的主要内容,如果未能解决你的问题,请参考以下文章
/usr/bin/ld: 搜索 -lQtCore 时跳过不兼容的 /usr/lib/x86_64-linux-gnu/libQtCore.so
在搜索 -ldeepsort 时跳过不兼容的 ../tracker/libdeepsort.so