您的位置:首页 > 其它

STL与.Net泛型类的比较

2016-04-11 17:41 141 查看
原文地址:http://blog.sina.com.cn/s/blog_4ed027020100be17.html

容器

.NetFramework有一个System.Collections.Generic命名空间,里面有一些常用的泛型类(数据结构),跟STL的容器很相似,MSDN上写得很乱,搞了一晚上,终于清楚了两者的对应关系。

名称
STL
.Net
动态数组
vector
List
双向队列
deque

队列
queue
Queue

stack
Stack
带优先级的队列
priority_queue

双向链表
list
LinkedList
单向链表
slist

平衡二叉树
set

带键/值对的平衡二叉树
map
SortedDictionary
哈希表
hashset
Hashset
带键/值对的哈希表
hashmap
Dictionary
带键/值对,有序的动态数组

SortedList
线程安全集合

SynchronizedCollection
其中,STL的关联容器(set,map,hashset,hashmap)都有对应的multi容器,但.Net没有,.Net只有通过自定义Comparor(比较算子)实现。

算法(函数模板)

STL的算法相对于.Net来说要丰富的多,STL的所有算法见本人文章《STL函数模板(即算法)一览》,相比之下,.Net只提供查找、替换、插入、删除、复制、最值、排序、反转、计数、累加、集合运算等等比较常见的算法。

STL的算法大多都是通用算法,STL用迭代器把容器与通用算法联系起来,而.Net不用迭代器,.Net所有的算法都是容器的成员函数,这样使得.Net的算法更加安全,但是却不如STL灵活。

函数对象

STL有许多现成的函数对象,而.Net几乎没有,.Net的函数对象基本上都要自己实现。但是这不代表.Net在这方面不如STL,事实上是.Net不需要现成的函数对象,因为.Net有Lambda表达式,可以说,.Net一个Lambda表达式可以顶STL那一大堆函数对象,而且功能比那一大堆函数对象更为强大、灵活、直观。什么less<>,logical_and<>,binder1st<>……通通都不用管它,只要一个Lambda表达式就够了。举个例子,数一个容器里所有小于10的数的个数,STL中可能要这么写:

count_if(v.begin(),v.end(),bind2nd(less<int>,10));

C#只要这样写:

v.Count((a)=>a<10);

VB中要这样写:

v.Count(Function(a)a<10)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: