2012-01-21 16 views
0

私は読み書きのために配列よりも速いベクトルがスタックオーバーフローやその他の場所で読んでいます。私が読んでいるファイルには、さまざまな種類の断片がたくさん含まれていますが、読み込むまで、各種類の断片がどれくらいあるかはわかりません。だから、例えばフラグメント1は、私は、ファイル1かかわらず、ループしている私の場合、ベクトルがより適切なのですか?C++

struct frag_1 
{ 
    int number1; 
    int number2; 
}; 

で識別できるのであれば、各断片の種類が表示された回数、例えば、構造体のような、フラグメントの構造体であることタイプのメモリの配列を割り当てる対抗私はそれらを満たし、それらを操作します。

ベクトルは読み書きの方がはるかに高速ですが、動的に追加することができるように見えますが、一般的にはより良い方法です。

これは本当ですか?ありがとうございました。

+2

* "私は、スタックオーバーフローや他の場所では、ベクトルが読み書きのための配列より高速であることを読んでいます。" *私はそのステートメントの真実性を疑う余地があります。最高でも、マイクロ最適化です。 – Thanatos

+0

これはまったく間違っています。 :-) – Mehrdad

+0

あなたは精巧にできますか?私はベクタが確かに速いというベンチマークをいくつか見た。 –

答えて

0

実際には、このパターンでは通常dequeが最適です。この目的のためにvectorを使用すると、最終サイズで少なくともおおまかに推測できない限り、実装が小さすぎるベクトルを使用するため、多数の割り当て/コピー/フリーサイクルが必要になります。

+0

ベクター内に存在しないデキューの利点は何ですか? deque要素にインデックスでアクセスできるというのは好きです。また、サイズを推測するにあたり、ここでどのような範囲の話をしていますか。私はリザーブ機能について話していると思いますので、再配置の束はありませんが、この例では200を選択し、実際のサイズは450です。どのようなパフォーマンスが期待できますか? –

+0

2つのうちのいずれかを実行できます。最初から最適な構造を選ぶことができます。パフォーマンスの問題がない限り、それを心配することはできません。あなたはこれらの2つの戦略の違いをいくつか奇妙な方法で分割しようとしているようです。ベクトルを拡大すると、allocate/copy/deallocateのパスが取られます。両端キューを拡大することはできません。どのくらいヒットするかは実装の詳細とアクセスパターンによって異なります。あなたが両端キューを選択した場合、それについて心配する必要はありません。 –

+0

@DavidSchwartz:特定の実装に頼ることなく、デキューを拡大する*が割り当て/コピー/デアロケートを必要としないとどう思いますか? – Thanatos

0

フラグメントの2つのリストがあります。フラグメントそのもので、number1number2がこの特定のタイプのフラグメントのメンバーです。

まず、フラグメントそのもの。あなたの説明が与えられた場合、特にあなたが持っている断片の数を事前に知らなければ、std::vectorを使用してください。 (あなたは何を述べていますか?)それはあなたのためにメモリの割り当てを行い、エラーの大幅な削減を大幅に上回ります。メンバーについては

、考えてみます。

struct frag_1 
{ 
    int numbers[2]; 
}; 

(。それはあなた(または私たちを導く可能性があるとして、また、より良い変数名を考える)「より良い」であると、より決定的な答えに)

私はあなたの使用のためにベクトル対配列を考慮したことに注意してください。後でいくつかのメンバーによっていくつかのフラグメントを検索する必要がある場合は、ある種のマッピングタイプがより適切かもしれません。すべてのフラグメントを読み込んでループするだけであれば、ほとんどの場合、通常はstd::vectorが問題ありません。

サイズ変更時の std:vector sのパフォーマンスに

あなたがベクトルの最終的なサイズがわかっている場合は、事前にベクトルを知らせることができます。最終的なサイズがわからない場合、コンテナに関係なく、サイズ変更とメモリ割り当てはになる可能性があります。ほとんどのコンテナは、再割り当てが行われていても、O(n)のパフォーマンスが得られます。あなたが求めている質問と、他の投稿が暗示しているように見えるのは、resizeがあなたのボトルネックになるということです。従って:のプロフィール。おそらく、ベクトルは仕事を完了させ、あなたがサイズ変更を気にしないほど速くそれを行います。ディスクから読み込む場合は、ディスクI/Oだけでもサイズ調整操作よりも大幅に優れているため、最適化がほとんど意味がありません。

+0

ある人は、おおよそのサイズを知らないことからパフォーマンスが低下したと言っていました(私は彼らがリザーブ機能を指していると考えています)、パフォーマンスが低下します。何を言ってるの? –

関連する問題