在 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
除了循环遍历每个元素之外,还有没有一种有效的方法来做到这一点? memcpy
或 memset
有什么技巧吗?
谢谢!
【问题讨论】:
你能想出一种方法来检查每个元素,看看它是“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++ 中重新组织缓冲区中数据的有效方法的主要内容,如果未能解决你的问题,请参考以下文章