如何将字符数量从char数组复制到向量?

时间:2012-12-05 14:06:53

标签: c++ stl

如何将字符数量从char数组复制到vector?起始索引始终为0并转到某个传递值x。我在堆上有char *缓冲区(大小为32 * 1024),我使用该缓冲区接收消息并在变量x中设置接收的消息大小。如何从第0个字符复制到第x个字符到vector<char> mainBuffer? (我可以简单地迭代,但如果消息很长,它看起来效率很低。另一种方式如下,但我总是在每次传递中创建新的向量)

char* buffer = new char[32*1024];
int x;
std::vector<std::vector<char> > mainBuffer;
//:loop
// here is some code where I recive message in buffer and set x
mainBuffer.push_back(std::vector<char>(buffer,buffer+x));
//:end loop

有没有人知道更有效率和更优雅的方法呢?

2 个答案:

答案 0 :(得分:3)

mainBuffer.push_back(std::vector<char>(buffer,buffer+x));
  

有没有人知道更有效率和更优雅的方法呢?

使用C ++ 11,执行:

mainBuffer.emplace_back( buffer,buffer+x );

这会转发参数并直接在mainBuffer中构造对象。

编辑:使用C ++(旧版),使用std :: swap:

mainBuffer.push_back( std::vector<char>() );
mainBuffer.back().swap( std::vector<char>(buffer, buffer+x) );

编辑2:如果可以,请在使用push_back之前调用mainBuffer上的reserve。

答案 1 :(得分:1)

如果您真的在寻找效率,那么在协议中执行此操作的典型方法是:

char* mainBuffer = new char[veryLargeNumber]
char* mainBufferPos = mainBuffer;
char* buffer = new char[normallyASmallNumber] 
while(...) {
    ...receive n bytes in buffer....
    memcopy(mainBufferPos, buffer, n);
    mainBufferPos += n;
    if (mainBufferPos > mainBuffer+veryLargeNumber) 
        break;    // buffer full, needs probably more handling...
}

通常情况下,我希望32 * 1024的大小超过大缓冲区的大小,而且你收到的消息的长度大于1024。