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 に答える