在 C++ 中重新组织缓冲区中数据的有效方法

Posted

技术标签:

【中文标题】在 C++ 中重新组织缓冲区中数据的有效方法【英文标题】:Efficient way to reorganize data in a buffer in C++ 【发布时间】:2013-04-27 00:34:01 【问题描述】:

假设我有一个如下所示的unsigned char 缓冲区:

unsigned char buffer = 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'

基本上我只想抓取 A 和 B,并将它们打包到一个新的缓冲区中,如下所示:

unsigned char buffer2 = 'A', 'B', 'A', 'B', 'A', 'B'  ... etc

除了循环遍历每个元素之外,还有没有一种有效的方法来做到这一点? memcpymemset 有什么技巧吗?

谢谢!

【问题讨论】:

你能想出一种方法来检查每个元素,看看它是“A”还是“B”没有循环至少一次 ??如果您正确配置比较器,copy_if 会这样做,但它仍然是一个循环。 (并且都不是有效的 C++;它们都是发送到 unsigned char 类型的单个缩放器变量的初始化列表。 你的意思是buffer[]buffer2[],对吧? 你想要一些 memcpy 的技巧,每 3 个字节跳过一次吗?呵呵。你必须自己写。 是的,我指的是 buffer[] 和 buffer2[],我认为这是一个难题,但我只是想确保我错过了什么。 【参考方案1】:

我从未使用过 memcpy,但我会这样做:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

class Modulo3

public:
    Modulo3();
    bool operator()(const char c);
private:
    int num_;
;

Modulo3::Modulo3()

    num_ = 0;


bool Modulo3::operator()(const char c)

    return num_++ % 3 == 0;


int main()

    string test = "ABCABCABC";

    Modulo3 func;
    remove_if(test.begin(),test.end(),func);

    return 0;

vector、list等代码相同

【讨论】:

改用Modulo3() : num_1(0) 我认为他想创建一个新数组,而不是从第一个数组中删除 您可以将字符串复制到另一个字符串中,然后使用代码。【参考方案2】:

如果您的数据按照示例中的方式排序,您可以循环递增 3 并复制前两个字节。否则,您将无法循环每个值。

【讨论】:

以上是关于在 C++ 中重新组织缓冲区中数据的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

在 SYCL 中使用一个缓冲区还是多个缓冲区更有效?

在 SYCL 中使用一个缓冲区还是多个缓冲区更有效?

c++缓冲池循环队列实现

重新启动 Clip 对象 - flush() 方法

是否有符合标准的方法在 C++ 中进行零拷贝 IPC?

为 DSP 目的在 C++ 中处理音频数据