2013-04-27 33 views
-1

比方说,我有一个unsigned char缓冲区,看起来像这样:有效的方式来重新组织数据到缓冲区中,C++

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做些什么?

谢谢!

+2

你能想出一种方法,你可以检查每个元素,看它是'A'还是'B'*没有循环*至少*一次*? [copy_if](http://en.cppreference.com/w/cpp/algorithm/copy)可以正确配置比较器,但它仍然是一个循环。 (并且*都不是有效的C++;它们都是发送到一个类型为'unsigned char'的单个缩放器变量的初始化器列表)。 – WhozCraig 2013-04-27 00:35:51

+0

你的意思是'buffer []'和'buffer2 []',对吧? – billz 2013-04-27 00:36:27

+0

你想用memcpy跳过每个第三个字节的一些技巧?嘿嘿。你必须自己写。 – David 2013-04-27 00:38:43

回答

0

我从来没有用过的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; 
} 

的代码是矢量,列表中的一样,等

+0

改为使用'Modulo3():num_1(0){}'。 – 0x499602D2 2013-04-27 01:07:49

+0

我想他想创建一个新的数组,而不是从第一个数组中移除 – David 2013-04-27 01:09:32

+0

您可以将该字符串复制到另一个数组中,然后使用该代码。 – lucas92 2013-04-27 01:18:48

0

如果您的数据进行排序的方式例如,您可以循环递增3并复制前两个字节。否则,你无法循环使用每一个值。