|
STL, I'm loving it |
小工头 发表于 2006/7/4 21:23:43 | C/C++是俺混IT的主要武器。N年下来,俺对它的感情不是一般的深,不论学什么新东西都拿C/C++来套。不过,C/C++的短处也着实让人头疼:作为最接近机器语言的高级语言之一,C的功能强大毋庸置疑,可是各种接口过于底层而且缺乏组织,用来实现复杂的应用功能极其繁琐。代码规模稍微大一点就特别容易发生腐化,不管是测试还是交接都很困难。C++把数据和操作封装在了一起,解决了这个问题。用C++可以开发大规模的软件而不必担心代码腐化的问题,代码的可重用性也有了极大的提高。但是C++的核心,OOP编程思想过于翻覆,继承、多重继承、多态、重载、覆盖、虚函数……掌握起来相当困难。假如交到手里的是前辈当年用来练手的代码,同样会郁闷得一P。
此外,C/C++都存在着一个明显的问题:字符/文本处理功能不够强大。在图形界面和网络界面风行的今天,这个缺陷几乎要了C/C++的命。都说C/C++很强大很核心,可是网络应用更多的是用容易上手的JSP、PHP,后台用的更多的是Perl、Python……虽说.NET和C#也打下了一片江山,可那能算C/C++么?俺对C/C++的感情是很深的,深到宁愿用C裸写CGI也不愿意碰JSP,还自欺欺人地说:“JSP是给小孩子玩的,C/C++才是程序员的王道~”
可是,用C/C++真的好累啊……当俺开始使用PHP的时候,俺感动得都要流泪了:$arr["key"]=value,简简单单的一句话就建起了一个key-value对,还不用操心内存的分配和释放问题(难忘在函数的每个出口挨个加上一堆free()的日子……),多么的幸福啊~如果用C/C++的话,恐怕早就烦死了。是否应该放弃C/C++,看看另外的语言呢?俺动摇了……
就在这时,STL出现在俺面前,让俺的心安定下来,不再摇摆。STL出现的时间并不很长,但它已经成为标准C++类库的一部分。STL使用了泛型编程的思想,实现了算法与具体数据类型的分离,提供了N多常用的算法,使得很多事情变得简单。不夸张地说,STL是C++在新时代重铸辉煌的希望。
让俺用一个实际的例子来说明吧。最近俺需要实现这样的流程:在给定目录下搜索文件,再从文件中提取特征字符串,通过MFC的图形界面显示出来,再根据用户的选择找到相应的文件,从中读出更多信息。这就需要维护文件名和特征字符串的对应关系表。MFC可以轻松实现搜索文件和从文件中提取信息的功能,可是维护对应关系的列表呢?如果使用没有STL的C++,俺大致会这么做:定义key-value数据结构,新建一个类,在类里面建key-value链表(偷懒的话就上一个大数组),再加上若干个指针以及其他描述链表信息的变量,然后做接口,构造、析构、增加结点、删除结点、查找结点、链表信息……哇噻,好high呀!如果用STL呢?请看源码:
map< string,string > mapLang;
map< string,string >::iterator miLang;
string sBuffKey,sBuffVal;
CPraLang lng;
CString strFilter = ".\\lang\\*.lng";
CString strBuff;
int ret;
CFileFind lngSearch;
BOOL bFind = lngSearch.FindFile(strFilter);
while(bFind){
bFind = lngSearch.FindNextFile();
ret = lng.Reset((char *)LPCTSTR(lngSearch.GetFilePath()));
if(ret == 0){
//用MFC实现的提取文件特征字符串 strBuff = lng.Name();
if(!strBuff.IsEmpty()){
sBuffKey = LPCTSTR(strBuff);
miLang = mapLang.find(sBuffKey);
if(miLang == mapLang.end()){
sBuffVal = LPCTSTR(lngSearch.GetFilePath());
mapLang.insert(make_pair(sBuffKey,sBuffVal));
m_ctrlLang.AddString(strBuff);
}
strBuff.Empty();
}
}
}
几行就结了,还带除错判断的。怎么样,简洁明快吧?
当然了,STL也有问题。使用泛型之后,编译出来的变量名往往会巨长。有的编译器对变量名的长度有限制,超过了就会报warning C4786。不幸的是,VC的编译器就是这种类型……即使是上面这一点点STL,每次编译过后都会看到100多个warning,每个warning长达三四行,真是壮观。达不到0 error 0 warning的境界不说,假如中间掺杂了一两个error的话……
最后记录一点小技巧。在MFC中使用STL的话,免不了要处理CString和string之间的转换。CString strMFC;
string strSTL;
strMFC = strSTL.c_str();
strSTL = LPCTSTR(strMFC);
还有,给map赋值时要用到make_pair。有时make_pair("a","b")这样的用法会报错,可以改用make_pair(string("a"),string("b"));
最后的最后强调一下,STL的意义绝不是仅限于补强C++的字符/文本处理能力。
|
|
|
| 回复:STL, I |
|
adai(游客)发表评论于2006/7/4 22:57:06 | 提醒一下,好像听说,stl是当前界面编程之王道噢!
加油!
|
|
|
» 1 »
|

|
.: 公告
有人的地方就有恩怨 有恩怨的地方就是江湖 人在江湖漂,谁能不挨刀 |
|
|
| « | April 2026 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | |
|
.: 我的分类(专题)
|
|

.: 最新日志
.: 最新回复
|
|

blog名称:少年包工头的工作日记 日志总数:629 评论数量:1458 留言数量:56 访问次数:9080681 建立时间:2004年12月8日 |
|

.: 留言板
|

.: 链接
|

|