关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

C#中的常用数据结构简单分析后与C++的数据结构对比

发布时间:2020-01-20 17:06:30

首先说明, C# 中的引用即为C++中的指针。 

值类型:内置数据类型,自定义的struct,不包括string。它们分配在栈上,超出作用域自动销毁。 

引用类型:自定义class或数组的实例以及string为引用类型,它们有一个引用(指针)指向它们。由GC负责回收。

装箱:将值类型转换为引用类型的过程称为装箱

int i = 67;   // i is a value type

object o = i;

以上代码会在堆上创建一个i;

ref 和 out关键字

类似于C++中的&引用,减少传值时的性能消耗,主要用在struct上。但是C#中不能创建const ref,out 和ref的区别仅在于使用out时必须进行赋值

void SetToTen(out int number)

{

 // If this line is not present, the code will not compile.

    number = 10;

}

Array 数组

普通的数组,不过需要使用new在堆上创建

int[] test = new int[size];

里面可以存放值类型或引用类型。

ArrayList

ArrayList test = new ArrayList();

test3.Add("chen");

test3.Add("j");

test3.Add("d");

test3.Add("is");

变长数组,和C++中的std::vector不同的是它可以存放不同类型的数据,意思就是内部它都会转化为object类型。 

它的缺点是: 

数据类型不安全,涉及到父类指针指向子类对象的问题。 

添加值类型时会发生装箱操作。

list<T>

完全类似于C++ 中的std::vector 可以当做vector来使用。

List<string> test = new List<string>();

LinkList<T>

类似于std::forward_list<T>

Queue<T>和Stack<T>

类似于std::queue和std::stack

Dictionary<K,T> 字典

类似于std::unordered_map, 内部用hash实现,链表处理冲突,时间复杂度低,空间复杂度大。



/template/Home/Zkeys/PC/Static