2012-05-11 12 views
-1

動的にサイズが変更されるchar配列が必要です。私はどのくらいの大きさを得ることができるのか分からないので、事前配分はオプションではありません。それは20バイトを1回も超えることはありません。次回は5kbまで達します。新しいサイズの呼び出しを最小限に抑えた可変サイズのchar配列?

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

私はSTDベクトル<文字を使用するのではと思った>しかし、彼らは時間を無駄にするように、すべてのものをプッシュバックは思え:

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

はこれが私にできる最善であるかのアイテムの束を追加する方法がありますすぐにベクトルに?これを行うより良い方法かもしれません。

おかげ

+0

参照[こちら](http://www.cplusplus.com/reference/stl/vector/resize/) – Shahbaz

+0

どのようなデータが使用されていますか? –

+2

'std :: vector'にはこの目的のための' reserve'メソッドがあります。 – AJG85

答えて

3

std::vectorはメモリにあなたがpush_backを呼び出すたびに割り当てませんが、大きさは、容量

1

あなたは束を追加するresizeメンバ関数を使用することができます。しかし、特にベクターの内部容量があまり重要でない場合は、push_backが遅くなるとは思わないでしょう。

+0

これは、ほぼ一定の時間の操作を考慮すると、push_backは問題ありません。要素を追加する前にコンテナのサイズを設定する唯一の時間は、バッファに書き込むC APIを使用する必要があるときです。幸い+1 – johnathon

2

まずより大きくなった場合にのみ、あなたのコードをプロファイリングし、ボトルネックがあると判断するまで、最適化しません。 。何かを賢明にすることによって、可読性、アクセシビリティ、保守性にかかるコストを考えてみましょう。今後どのような計画を立ててもUnicodeの使用を妨げることはありません。まだここ?よかった。

他の人が触れたように、ベクターは最初に使用したよりも多くのメモリを予約しています。通常、push_backは非常に安価です。

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

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

あなたは、多分あなたは、リンクされたリストを使用する必要があり、事前にあなたの文字列のサイズがわからないと、おそらく理由は、ハードリアルタイム制約の再配分によって引き起こされるしゃっくりを、許容できない場合。リンクされたリストは、平均パフォーマンスが非常に悪いという点で、一貫したパフォーマンスを発揮します。

このすべてでは十分ではない場合は、ropeなどの他のデータ構造を考慮するか、ケースについてより詳しく説明してください。スコット・マイヤーの効果的なSTLから

1

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

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番目の形式では、値を配列に格納してから、配列をベクトルの最後にコピーすることができます。しかし、これは削除するほど複雑になる可能性があります。それが、マイクロ最適化の方法です。測定可能な利益があることがわかっている場合にのみ最適化を試みます。

関連する問題