2011-08-10 23 views
8

現時点では、私はSTLベクトルコンテナテンプレートを使用して接続を取り、接続を取得します。プールコンテナの最適なデータ構造は何ですか?

1)取得すると、接続が返され、プールベクターから "erase()"が返されます。

2)リリースでは、接続は "push_back()"を介してプールに戻されます。

プールが頻繁に使用される場合、これは非常に重いことがあります。だから私の質問は、ここに他のデータ構造に切り替えることでパフォーマンスを向上させる方法はありますか?

+1

ボトルネックはほとんどないと思われますので、プロファイリングは無作為に最適化するよりも優れています。 – Simone

+0

確かなこと - プロファイリング。コンテナを使った正しいアプローチだと思っています。 – Myz

答えて

11
  • 背面にのみ追加して背面から消去すると、vectorは問題ありません。
  • フロントとバックの両方に追加して消去する場合は、中間からは削除しないでください。dequeを使用してください。
  • 頻繁に挿入して中央から削除する必要がある場合は、listを使用してください。
  • ルックアップとトラバーサルの要件によっては、setのいずれかの方法があります。

いずれにしても、のプロファイルのパフォーマンスが必要です。メインコンテナのtypedefを使用して、異なるオプションを素早く切り替えてテストすることができます。

あなたは私たちに言っていないが、コンテナの選択のために重要である他の要件があるかもしれません:

  • ベクトルと両端キューがランダム・アクセス・コンテナです。リストとセットはノードベースです。これは反復子の無効化に影響します。
  • ベクトルで、dequeとlistはシーケンスコンテナですが、setは連想型です。これは値によるルックアップに影響します。
+0

+1はプロファイラーに言及します。 – Simone

+0

OPが後ろから消去していない場合、彼はこのアプローチ(つまり、常に 'pop_back'と' push_back')を考慮する必要があります - それはプールなので、* order *がないと推測していますそれは常に最後の項目をとにかく使用すると有益かもしれません... – Nim

+0

の順番はありません – Myz

2

事前に可能な最大接続数を知っている場合は、ベクトルを保持してください(vector :: reserveを参照)。

それ以外の場合はstd :: listを使用します。

最終的には、使用しているプラ​​ットフォームとコンパイラのバージョンとlibstdC++のバージョンによっても異なります。

+0

'std :: list'はすべての挿入物の割り当てを意味します。これは 'std :: vector'より高速ではありません。 –

3

はおそらくプールに最適なコンテナです。 O(1)を挿入する必要があり、注文を保守する必要がない場合はO(1)を削除することもできます。アイテムを削除して最後のアイテムを交換し、ベクトルを縮小することができます。またstd::vectorは、他のコンテナに比べてかなりスペース効率が良いです。メモリ消費量が少ないということは、より多くのCPUキャッシュヒットがあるため、より良いパフォーマンスを意味します。

関連する問題