W3CHINA Blog首页    管理页面    写新日志    退出

Blue blue sky

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++的字符/文本处理能力。

阅读全文(2135) | 回复(1) | 编辑 | 精华

 


回复:STL, I
adai(游客)发表评论于2006/7/4 22:57:06

提醒一下,好像听说,stl是当前界面编程之王道噢! 加油!

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
 



This is home

.: 公告

有人的地方就有恩怨

有恩怨的地方就是江湖

人在江湖漂,谁能不挨刀


Bloginess

«April 2026»
1234
567891011
12131415161718
19202122232425
2627282930

.: 我的分类(专题)

首页(629)
杂项(69)
我喜欢过的声音(35)
耳机评测(18)
七天乐(127)
工作八卦(174)


In the Bowl

.: 最新日志

变化:俺的2012
迟来的总结,俺的2011
暂停更新:娶了媳妇不上网
一次坦诚的大会
妹子,妹子!
领导满月
当了领导能怎样
俺的播放列表
俺的重构总结
开会的故事

.: 最新回复

回复:迟来的总结,俺的2011
回复:暂停更新:娶了媳妇不上网
回复:暂停更新:娶了媳妇不上网
回复:小学生作文之记一次拔河比赛
回复:暂停更新:娶了媳妇不上网
回复:暂停更新:娶了媳妇不上网
回复:暂停更新:娶了媳妇不上网
回复:一次坦诚的大会
回复:一次坦诚的大会
回复:一次坦诚的大会


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



Text Me

.: 留言板

签写新留言

你太客气了
工作是为了更好的生活。。。
飘过!
初烧耳机
路过留声
自动浇花
节日快乐
向您请教
HAHA
咨询下呵呵


Other Fish in the Sea

.: 链接



Lake JJ

真!鱼家MM

传说中的99

王小四的自留地

挣扎中的职场新人tintin同学




站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.967 second(s), page refreshed 144831356 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号