-1

サイズが動的に変化するchar配列が必要です。どれだけ大きくなるかわからないので、事前に割り当てることはできません。1回は20バイトを超えることはなく、次回は最大5kbになる可能性があります...

割り当てをstdベクトルのようにしたいと思います。

std vector <char>を使用することを考えましたが、これらのプッシュバックはすべて時間を浪費しているようです。

strVec.clear();
for(size_t i = 0; i < varLen; ++i)
{
   strVec.push_back(0);
}

これは私ができる最善の方法ですか、それとも一度にたくさんのアイテムをベクターに追加する方法はありますか?または、これを行うためのより良い方法かもしれません。

ありがとう

4

4 に答える 4

3

std::vector呼び出すたびにメモリを割り当てるのではなくpush_back、サイズが容量より大きくなった場合にのみ割り当てられます

于 2012-05-12T00:02:43.550 に答える
2

まず、コードのプロファイルを作成し、ボトルネックがあると判断するまで、最適化しないでください。何か賢いことをすることによって、読みやすさ、アクセシビリティ、および保守性のコストを考慮してください。計画を立てても、将来Unicodeでの作業が妨げられないようにしてください。まだここ?大丈夫。

他の人が述べているように、ベクトルは最初に使用するよりも多くのメモリを予約し、push_backは通常非常に安価です。

ただし、push_backを使用すると、必要以上にメモリが再割り当てされる場合があります。たとえば、myvector.push_back()を100万回呼び出すと、myvectorの再割り当てが10回または20回トリガーされる可能性があります。一方、ベクトルの最後に挿入すると、最大で1つのmyvector*の再割り当てが発生します。私は一般的に、速度と読みやすさの両方の理由から、reserve/push_backイディオムよりも挿入イディオムを好みます。

myvector.insert(myvector.end(), inputBegin, inputEnd)

文字列のサイズが事前にわからず、再割り当てによって引き起こされる一時的な中断を許容できない場合は、リアルタイムの制約が厳しいためか、リンクリストを使用する必要があります。リンクリストは、平均パフォーマンスが大幅に低下する代わりに、一貫したパフォーマンスを発揮します。

これらすべてが目的に十分でない場合は、ロープなどの他のデータ構造を検討するか、ケースに関する詳細を投稿してください。

  • スコットマイヤーの効果的なSTL、IIRCから
于 2012-05-12T04:28:18.560 に答える
1

これは私ができる最善の方法ですか、それとも一度にたくさんのアイテムをベクターに追加する方法はありますか?または、これを行うためのより良い方法かもしれません。

push_backそれほど遅くはありません。サイズを現在の容量と比較し、必要に応じて再割り当てします。CPUでの分岐予測とスーパースカラー実行のため、比較は本質的にゼロ時間になる可能性があります。再割り当てはO(log N)回実行されるため、ベクトルは必要なメモリの最大2倍を使用しますが、再割り当てに費やされた時間が何にもならないことはめったにありません。

一度に複数のアイテムを挿入するには、を使用しますinsert。いくつかのオーバーロードがありますが、唯一のトリックは、明示的に渡す必要があることですend

my_vec.insert( my_vec.end(), num_to_add, initial_value );
my_vec.insert( my_vec.end(), first, last ); // iterators or pointers

2番目の形式では、最初に値を配列に入れてから、その配列をベクトルの最後にコピーできます。しかし、これはそれが取り除くのと同じくらい多くの複雑さを加えるかもしれません。それがマイクロ最適化とどのように関係するかです。測定可能な利益があることがわかっている場合にのみ、最適化を試みてください。

于 2012-05-12T04:50:39.810 に答える
1

メンバー関数を使用してresize、束を追加できます。push_backただし、特にベクトルの内部容量がすでに自明でない場合は、それが遅くなるとは思いません。

于 2012-05-11T23:57:52.460 に答える