原文地址: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)