【问题标题】:memcpy equivalent for skipping x bytes while copying (not just initial x bytes)?复制时跳过 x 字节的 memcpy 等效项(不仅仅是初始 x 字节)?
【发布时间】: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 原始数据 - 我会更新我的问题。

标签: c++ boost stl


【解决方案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 似乎经常提供一些有用的辅助函数,但我最终实现了一个简单的循环函数来完成这项工作,因为它似乎是最简单和合适的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多