2010-12-10 10 views
6

私は非常に古いCコードをC++に移植しており、配列内に実装されたリンクリストを介して実行しています。この要素は単純な構造です。実装方法についての考え方は?

インデックスとしてわかっている場合は、配列として、データにすばやくアクセスできます。リンクされたリストのアスペクトは、要素を移動させ、リストから「削除」することができます。エレメントは、使用頻度に基づいてリスト内で移動できます(MRUの場合は上、LRUの場合は下)。

私はこれを実装するために、別の配列を使うよりも良い方法を見つけるのが好きです。私はSTLを使いたいと思いますが、どのコンテナを使うのが最適かはわかりません。

いずれかの考えがありますか?

+0

ランダムアクセス速度は非常に重要ですか?反復するのではなく、たくさん*発生するのでしょうか? – Guy

+0

これはコードの残りの部分でどのように使用されているかによってまったく異なります。直接アクセスは要素にアクセスする一般的な方法ですか、それとも主にリストを踏んで実行されますか?いくつかの要素は他の要素より頻繁にアクセスされますか? – suszterpatt

+3

コンテナの中央からアイテムを追加/削除していても、 'std :: vector'がほとんど常に' std :: list'よりも優れた選択肢であるという主張を主張した(そして擁護した)記事を読んでいます。私は今記事を見つけることができないので、答えの代わりにこれをコメントとして追加しました。記事を知っている他の人がリンクを投稿できるのであれば、私は感謝しています。 –

答えて

10

これは、リンクされたリストであるので、あなたはおそらくstd::list ...

を使用する必要があります親指のルールは、あなたが、リスト内のランダムな位置に要素を挿入する必要がある場合、リンクされたリストを使用したいということですかランダムな要素をリストから削除します。主にリストの最後に要素を追加/削除する必要がある場合は、std::vectorを使用する必要があります。リストの先頭または最後に要素を追加または削除する必要がある場合は、std::dequeを使用してください。

ここでは、確率について話しています。青い月に一度std::vectorの中に要素を挿入する必要がある場合は、おそらく問題ありません。しかし、これを常に行う必要がある場合は、ベクトルが常に要素を移動し、おそらくメモリを再割り当てする必要があるため、パフォーマンスに大きな影響を与えます。一方、ベクトルを使用する利点は、その要素がメモリ内で連続していることで、キャッシュのために単純にトラバースする必要がある場合は、パフォーマンスが大幅に向上します。

+0

最も一般的なアクセスは直接アクセス – kberson

+2

@kberson nb。そのstd :: listはインデックスによる直接アクセスをサポートしていません。 – razlebe

+0

インデックスだけで要素に直接アクセスできる必要があります。要素を動かす必要があるので、stl :: vectorは動作しません。 – kberson

4

このリストのデータはポインタなので、リンクされたリストを使用するのはどうしてですか?小さなPODの場合、通常は最初にstd::vectorが最善の賭けとなり、プロセッサキャッシュを使ったデータの局所性が良好であるため、理論的にはリンクリストを改善する必要がある場合でも連結リストよりも優れています。私はstd::vectorを選択して、パフォーマンス上の問題があることを示すプロファイリングがあり、std::listのパフォーマンスが向上するまで表示されます。

関連する問題