探讨一下C++和C#在线性表上的相同和不同
不知道有没有小伙伴是这样的,一边学习C++一边学习C#。C++和C#虽然在使用逻辑上有很大的不同,但是二者在语法上有着很多相似的地方,甚至有着很多重名的地方,但是内核却完全不同。
在这里我也是花了一些时间整理了一下 C++ 和 C# 的 List 有哪些异同。
1. C++
首先C++的List是STL里面的一个容器,并不是C++所自带的,C++在STL中有两个线性表容器分别是Vector和List,其中我们可能比较常用Vector,对于List的使用比较少。
这里如果嫌啰嗦,直接从结论上来看就是vector底层是数组,List底层是双向链表。
1.1. Vector
- 动态开辟的一维数组,在内存中是连续的;
- 可以随机存储,时间复杂度是O(1);
- 尾部增删是常数级,而中间插入和删除需要移动数据,复杂度是O(n);
- 有迭代器辅助指向分配的空间;
- 当存储满了的时候,可以自动扩容1.5倍或者2倍;
- 扩容时需要重新分配空间,复制元素,释放原有内存等操作。
1.2. List
- 是一个双向链表,在内存中不连续;
- 不支持随机读取,需要先定位;
- 可以在任何位置高效插入删除;
2. C#
C#中我们常用的就是List,其实C#中还有一个ArrayList也是线性表,这个使用比较少。
这里很关键的点就是,C#的List和C++的List完全不同,反而和Vector有点像。
2.1. List
- 一个可伸缩数组组件,底层是一维数组;
- 初始容量为0,加入一个元素后,容量为16,每次扩容2倍;
- 可以随机读取,效率很快;
- 频繁扩容会产生很多内存垃圾,对GC的负担很大;
- Add,Insert,IndexOf,Remove等接口都是顺序迭代,没有进行过优化。
2.2. List和ArrayList的不同
因为ArrayList比较特殊,所以拿来和List比较更方便大家理解。
- 类型安全:
- List是类型安全的,因为List在指定类型后只能存放该类型的数据;
- ArrayList是非泛型集合,存放的并不是数据本身,而是数据的引用,所以在存放时是可以混合存储不同类型数据的,所以会存在类型安全的问题;
- 性能:
- List中我们只能存取创建时指定的泛型类型的数据,不会有类型转换的问题,效率较高;
- ArrayList由于存储的数据是对象的引用,所以对于值类型需要进行装箱和拆箱的操作,会带来一定的性能开销;即便是引用类型,也是需要显示的类型转换,所以在性能上要差一些。
感谢您阅读到这里,希望对您学习有所帮助。