JavaのArrayListのC ++バージョンは何ですか


回答:


88

標準ライブラリのstd::vectorクラスを使用します。


3
うーん...他の答えから、ベクトルがリンクリストとして実装されていないように聞こえますか?私は正しいですか?私はこのリストをコレクションとして使用しており、オブジェクトの回転率がかなり高くなり、オブジェクトが追加および削除されます。この配列は実際に最良の実装ですか?または、リンクリストバージョンはありますか?
インター

5
@ interstar-絶対に正しい。リンクリストのセマンティクスが本当に必要な場合は、を使用しstd::listますが、インデックス作成機能が失われるため(no operator[])、実際には配列ではありません。listそれはそれ自身の特異性を持っているので、vectorしばしばより良い選択です。標準のC ++コンテナでは、いずれかの方法で妥協する必要があります。見てくださいdeque、それはあなたにとってより良いパフォーマンスを提供するかもしれません。コード内で大部分が交換可能であるため、vectorvsとdequevsの測定は(比較的)簡単です。listたとえば、コンテナにtypedefを使用するだけtypedef vector<MyObj> MyListです。
Steve Townsend

さて、最初にベクトルを試してみます。インデックスが便利だから。遅すぎる場合は、リンクリストに移動することがあります。ありがとう
インター

2
@interstarはArrayList、名前から推測できるかもしれませんが、リンクリストとしても実装されていません。あなたは考えているかもしれませんLinkedList。また、リストに追加および削除されたオブジェクトの回転率がかなり高い場合でも、最初に十分なスペースを割り当てて再割り当てする必要がない場合vectorよりも高速になる可能性がありlistます(つまり、必要な最大スペース)。
カイルストランド

@KyleStrandそれは興味深いです。ArrayListは、「配列として実装されるリンクリストのようなもの」ではなく、「リンクリストとして実装される配列のようなもの」を意味すると常に思っていました。
インター

63

vectorここで再利用する追加のポイントがいくつかあります。

異なり、ArrayListおよびArrayJavaで、あなたは治療のために何も特別なことをする必要はありませんvector配列として- C ++での基盤となるストレージは、連続的かつ効率的にインデックス可能であることが保証されます。

とは異なりArrayList、はvector、本格的なオブジェクトとしてカプセル化することなく、プリミティブ型を効率的に保持できます。

からアイテムを削除するときはvector、連続したストレージを維持するために、削除されたアイテムの上にあるアイテムを下に移動する必要があることに注意してください。これは、大きなコンテナでは高額になる可能性があります。

複雑なオブジェクトを格納する場合はvector、そのコピーコンストラクターと代入演算子が効率的であることを確認してください。裏で、C ++ STLはコンテナのハウスキーピング中にこれらを使用します。

reserve()後の拡張でのメモリの再割り当てを最小限に抑えるために、ストレージを事前に(つまり、ベクトルの構築時または初期化時に)ingすることに関するアドバイスは、JavaからC ++に引き継がれます。


6
はるかに良い答えは、受け入れられたものでなければなりません。
ポールルーニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.