連続したメモリを備えたC ++ベクトルと同等のC#?


87

C ++ベクトルに相当するC#は何ですか?

私はこの機能を探しています:

標準アレイと比較してアクセスのパフォーマンスを低下させない、連続して格納されたメモリの動的アレイを用意する。

私が探していたところ、彼らはこう言っています.NET equivalent to the vector in C++ is the ArrayList

ArrayListにはその連続したメモリ機能がありますか?


4
構造がメモリにどのように割り当てられるかを指定する(または一貫して期待する)には、CLRが金属に十分に近づいていませんか?
Aphex 2011

回答:


104

あなたは使用することができList<T>、いつT場合はケースではないでしょう、それは連続したメモリに割り当てられることになる値型であるT参照型です。

例:

List<int> integers = new List<int>();
integers.Add(1);
integers.Add(4);
integers.Add(7);

int someElement = integers[1];

2
@cMinor、List<T>クラスのドキュメントには多くの例が含まれていますが、回答を更新して1つを含めました。
ダリンディミトロフ2011

5
私はCLRに100%精通しているわけではありませんTが、参照型であっても、連続したメモリがあることは理にかなっています。それは...基本的にポインタの配列です
josaphatv

「Tが参照型の場合はそうではありません」-それはT[]... OPが「アクセスと標準配列のパフォーマンスの低下なし」を要求し、それをList<T>提供するのと同じです。また、Tが参照型の場合T*、これはC ++に類似しているため、C ++と同じくらいの連続性が得られます。オブジェクト自体を連続させたい場合は、もちろん、両方の言語の値型が必要です。もちろん、違いは、C ++では任意の型をvalueまたはrefとして使用できるのに対し、C#ではクラス/構造体の区別による型のプロパティであるということです。
ジムバルター2015

今日何かを学びました。List<T>常にリンクリストとして内部的に実装されていると思いました。では、呼び出すと、どのように動的に拡張するのAdd()でしょうか。Redim Preserveアレイ全体を新しい場所にコピーするために使用されたVB6のようなものですか?
dotNET 2016年

@dotNetは、内部的にList<T>小さな配列を作成しますT[]。アイテムは内部的に配列に追加されます。配列のサイズが完了すると、前の2倍のサイズの新しい配列が作成されます。データは新しい大きい配列にコピーされ、小さい配列は破棄されます。開発者は、List viaコンストラクターに入力する前に、.NETに十分な大きさの内部配列を作成するためのヒントを与えることができますnew List<T>(expected_array_size)
Artru

16

を使用しますList<T>。内部的には配列を使用し、配列は連続したメモリを使用します。


2
完全に真実ではありません。Tが参照型の場合、連続したメモリはありません。
Matteo Mosca 2011

2
@Matteoソースを見ると、 private T[] _items;バックエンドストレージ、参照型に使用されているかどうかに関係なく使用されています。
Bala R

13
まあ、私はそれを知っています。でも教えて。List <SomeClass>があります。SomeClassインスタンスへの参照は連続したメモリに保存されますが、インスタンス自体には保存されません。参照型として、それらはヒープ内にあり、ヒープがどのように機能するかを確実に知っています。
Matteo Mosca 2011

参照を連続して格納する@MatteoMoscaは、少なくとも1レベルの間接参照を削除します。私が推測する何もないよりはましだ。
Tim Seguine 2014年

7
@MatteoMosca OPは、「アクセスと標準アレイのパフォーマンスの低下はない」と要求しました。これは、Tが何であるかに関係なく、List <T>にも当てはまります。したがって、このページへのコメントはすべてオフポイントです。
ジムバルター2015

16

まず第一に、Arraylistまたはから離れてくださいHashtable。これらのクラスは、ジェネリックスを優先して、非推奨と見なされます。それらはまだレガシー目的のための言語です。

今、あなたが探しているのはList<T>クラスです。Tが値型の場合、連続メモリがありますが、Tが参照型の場合は、明らかな理由からそうではないことに注意してください。


15

C#には多くの参照型があります。コンテナが参照を連続して格納している場合でも、オブジェクト自体がヒープ全体に散在している可能性があります


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.