0

如何将字符范围从字符数组复制到向量?起始索引始终为 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

有谁知道更有效和优雅的方式来做到这一点?

4

2 回答 2

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。

于 2012-12-05T14:34:44.340 回答
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。

于 2012-12-05T14:21:43.183 回答