什么是C ++向量的C#等价物?
我正在搜索此功能:
拥有一个连续存储的动态数组,与标准数组相比,其访问性能不会受到影响。
我正在搜索,他们说.NET equivalent to the vector in C++ is the ArrayList
,所以:
ArrayList是否具有该连续内存功能?
Answers:
您可以使用a 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>
该类的文档包含许多示例,但我已经更新了答案以包括其中一个。
T
是引用类型,您仍然会有连续的内存,这是有道理的。它基本上是一个指针数组...
T[]
...一样多。OP要求“对访问标准数组不造成性能损失”,并List<T>
提供了这一点。而且如果T
是引用类型,则类似于T*
C ++,因此您可以获得与C ++一样多的连续性。如果人们希望对象本身是连续的,那么当然需要两种语言的值类型...。当然,区别在于,在C ++中,任何类型都可以用作值或ref,而在C#中,通过类/结构区分,它是该类型的属性。
List<T>
总是在内部实现为链接列表。那么,当我们打电话时,它如何动态扩展Add()
?VB6之类的东西Redim Preserve
曾经用于将整个阵列复制到一个新位置?
List<T>
创建一个小数组T[]
。内部项目将添加到数组中。数组大小完成后,将创建一个新数组,大小是前一个数组的两倍。数据被复制到新的较大数组,较小的数组被销毁,依此类推。开发人员可以提示.NET在填充List
via构造函数之前创建足够大的内部数组:new List<T>(expected_array_size)
。
使用List<T>
。在内部它使用数组,而数组确实使用连续内存。
private T[] _items;
该文件用于后端存储,无论引用类型与否。
首先,请远离Arraylist
或Hashtable
。这些类被认为是不推荐使用的,而赞成泛型。它们仍然是出于遗留目的而使用的语言。
现在,您正在寻找的是List<T>
课程。请注意,如果T是值类型,则将有连续内存,但如果T是引用类型,则没有明显的原因。
C#有很多引用类型。即使容器连续存储引用,对象本身也可能分散在堆中
看起来CLR / C#可能很快会获得对Vector <>的更好支持。