C ++の使用に戻り、最近作成した単純なJavaプログラムを変換しようとしています。
C ++のJavaArrayListに相当する好ましいものは何ですか?
回答:
標準ライブラリのstd::vector
クラスを使用します。
std::list
ますが、インデックス作成機能が失われるため(no operator[]
)、実際には配列ではありません。list
それはそれ自身の特異性を持っているので、vector
しばしばより良い選択です。標準のC ++コンテナでは、いずれかの方法で妥協する必要があります。見てくださいdeque
、それはあなたにとってより良いパフォーマンスを提供するかもしれません。コード内で大部分が交換可能であるため、vector
vsとdeque
vsの測定は(比較的)簡単です。list
たとえば、コンテナにtypedefを使用するだけtypedef vector<MyObj> MyList
です。
ArrayList
、名前から推測できるかもしれませんが、リンクリストとしても実装されていません。あなたは考えているかもしれませんLinkedList
。また、リストに追加および削除されたオブジェクトの回転率がかなり高い場合でも、最初に十分なスペースを割り当てて再割り当てする必要がない場合vector
よりも高速になる可能性がありlist
ます(つまり、必要な最大スペース)。
vector
ここで再利用する追加のポイントがいくつかあります。
異なり、ArrayList
およびArray
Javaで、あなたは治療のために何も特別なことをする必要はありませんvector
配列として- C ++での基盤となるストレージは、連続的かつ効率的にインデックス可能であることが保証されます。
とは異なりArrayList
、はvector
、本格的なオブジェクトとしてカプセル化することなく、プリミティブ型を効率的に保持できます。
からアイテムを削除するときはvector
、連続したストレージを維持するために、削除されたアイテムの上にあるアイテムを下に移動する必要があることに注意してください。これは、大きなコンテナでは高額になる可能性があります。
複雑なオブジェクトを格納する場合はvector
、そのコピーコンストラクターと代入演算子が効率的であることを確認してください。裏で、C ++ STLはコンテナのハウスキーピング中にこれらを使用します。
reserve()
後の拡張でのメモリの再割り当てを最小限に抑えるために、ストレージを事前に(つまり、ベクトルの構築時または初期化時に)ingすることに関するアドバイスは、JavaからC ++に引き継がれます。