C ++ベクトルに相当するC#は何ですか?
私はこの機能を探しています:
標準アレイと比較してアクセスのパフォーマンスを低下させない、連続して格納されたメモリの動的アレイを用意する。
私が探していたところ、彼らはこう言っています.NET equivalent to the vector in C++ is the ArrayList
:
ArrayListにはその連続したメモリ機能がありますか?
回答:
あなたは使用することができList<T>
、いつT
場合はケースではないでしょう、それは連続したメモリに割り当てられることになる値型であるT
参照型です。
例:
List<int> integers = new List<int>();
integers.Add(1);
integers.Add(4);
integers.Add(7);
int someElement = integers[1];
List<T>
クラスのドキュメントには多くの例が含まれていますが、回答を更新して1つを含めました。
T
が、参照型であっても、連続したメモリがあることは理にかなっています。それは...基本的にポインタの配列です
T[]
... OPが「アクセスと標準配列のパフォーマンスの低下なし」を要求し、それをList<T>
提供するのと同じです。また、T
が参照型の場合T*
、これはC ++に類似しているため、C ++と同じくらいの連続性が得られます。オブジェクト自体を連続させたい場合は、もちろん、両方の言語の値型が必要です。もちろん、違いは、C ++では任意の型をvalueまたはrefとして使用できるのに対し、C#ではクラス/構造体の区別による型のプロパティであるということです。
List<T>
常にリンクリストとして内部的に実装されていると思いました。では、呼び出すと、どのように動的に拡張するのAdd()
でしょうか。Redim Preserve
アレイ全体を新しい場所にコピーするために使用されたVB6のようなものですか?
List<T>
小さな配列を作成しますT[]
。アイテムは内部的に配列に追加されます。配列のサイズが完了すると、前の2倍のサイズの新しい配列が作成されます。データは新しい大きい配列にコピーされ、小さい配列は破棄されます。開発者は、List
viaコンストラクターに入力する前に、.NETに十分な大きさの内部配列を作成するためのヒントを与えることができますnew List<T>(expected_array_size)
。
を使用しますList<T>
。内部的には配列を使用し、配列は連続したメモリを使用します。
private T[] _items;
バックエンドストレージ、参照型に使用されているかどうかに関係なく使用されています。
C#には多くの参照型があります。コンテナが参照を連続して格納している場合でも、オブジェクト自体がヒープ全体に散在している可能性があります
CLR / C#はまもなくVector <>のサポートが向上する可能性があるようです。