Bootstrap

探讨一下C++和C#在线性表上的相同和不同

探讨一下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由于存储的数据是对象的引用,所以对于值类型需要进行装箱和拆箱的操作,会带来一定的性能开销;即便是引用类型,也是需要显示的类型转换,所以在性能上要差一些。

感谢您阅读到这里,希望对您学习有所帮助。

;