STL使用入门( Using STL)

STL使用入门( Using STL)  

r5 - 09 Jul 2005 - 09:04:04 - WinterWen You are here: TWiki  >  Main Web  >  WebLeftBar > STLChina  >  STLUsingSTL

STL使用入门( Using STL)

作者:Zoran M. Todorovic
原文: Using STL.
翻译: Winter

0 前面的话(Winter)

C++已经在中国相当普及,但C++ STL却使用的人不多。许多人有一定成见,认为STL降低了C++的效率。特别是那些自诩为技术专家的人,他们一直使用C语言,对于新事物总是先用批判的眼光对待......先不说这些,我这几天看见 http://stl.winterxy.com网站上的这篇小文,发现写得简明扼要,通俗易懂。翻译出来,希望对STL的普及有一定帮助。

1 介绍

我最开始结束C++编程是从DOS下的Borland C++开始的。那时他们在最新版本3.1中就包含了一套模板库用来做collection.那真是个好东东。当我开始使用Visual C++ 2.2的时候,我甚至试图去把Borland公司的collection模板库嵌入到Visual C++中去,但是没有成功。唯一可行的解决方案是切换到微软(Microsoft)的collection上,它是MFC的一部分分。但总是有些问题,其原因如下:

 

  • 一旦实现部分已经代码写完,很难从一种容器(container)类型切换到另外一种容器。
  • 不同容器的迭代器(Iterators)不一样。
  • 如果你在写一个DLL(动态链接库), 服务程序(service)或者终端应用程序,需要用到容器,你要么动态要么静态链接MFC,这使得你不得不依赖于MFC.

最近我开始使用STL,发现它真是太棒了!入门可能稍微难一些,但一旦你开始了,它就变得非常容易。本文包含了一些使用STL的入门经验,主要是面向那些希望能快速使用STL又不想了解那些琐碎细节的程序员。

2 规则

Rule 1:

你可以生成STL容器,用来存放对象或者指向对象的指针。

class TMyClass;
typedef list<TMyClass> TMyClassList;     // 用于存放对象的list容器
typedef list<TMyClass*> TMyClassPtrList; // 用于存放对象指针的list容器
一般来说,list容器用于存放对象。但是,如果你是需要保存一些机器资源(例如,文件句柄,命名管道、套接字(socket)或者其他类似的资源),那么你需要使用list来保存指向这些对象的指针。

如果容器是保存的对象,则在容器析构的时候会自动清理这些对象。但,如果它保存的是对象的指针,删除指针就应该是程序员的责任了。

 

Rule 2

对需要保存到容器中的对象的类型来说,每个类都必须至少实现拷贝构造函数,最好还能重载赋值操作符。

class TMyClass {
        private:
        ...
        public:
        TMyClass(..);
        
        // 拷贝构造函数
        TMyClass(const TMyClass& obj)  { *this = obj; }
        
        // 赋值操作符
        TMyClass& operator=(const TMyClass& obj);    
        ...
};
当你把一个对象的实例插入到容器中,STL会自己重新生成一个此对象的拷贝,因此拷贝构造函数就成为必须的了。如果你没有为拷贝构造函数写正确的代码,就有可能造成list中对象的某些数据成员没有初始化。

 

Rule 3:

按照下列方式把一个对象插入到容器中:

TMyClass object;
TMyClassList myList;
TMyClassList::iterator it;

it = myList.insert(myList.end(), object);
TMyClass *pObject = &(*it);
上面的例子显示了如何把一个对象插入容器中,并得到这个在容器中的对象的指针。由于容器将会为这个对象产生一个新的拷贝,原始的那个对象实例就不再使用了,因此得到其指针是很有必要的。若你是用list来保存指针,这个操作就没有多大必要了,因为原始的指针会被保存到容器中。

 

Rule 4:

通过下面的方式,使用迭代器遍历整个容器:

TMyClassList::iterator it;
TMyClass *pObject;
for (it = myList.begin(); it != myList.end(); it ++) {
        pObject = &(*it);
        // 使用 pObject 
}
不过,若你是用容器来保存对象的指针,上面的代码需要做如下修改:
TMyClassList::iterator it;
TMyClass *pObject;
for (it = myList.begin(); it != myList.end(); it ++) {
        pObject = *it;
        // 使用 pObject 
}
Rule 5:

按照下面的方法可以删除容器中的元素:

TMyClassList::iterator it;
TMyClass *pObject;
for (it = myList.begin(); it != myList.end(); it ++) {
        pObject = &(*it);
        if (pObject 满足某些删除的标注) then
        myList.erase(it);
        // 若list里面保存的是指针,那么增加下面代码
        delete pObject;
}
容器不会删除其保存的指针,需要手动删除,因此再上面代码中增加了额外一行。

 

3 结论

STL中唯一缺少的一个函数就是CString::Format() .

希望本文能给你足够的信息,让你能开始使用STL,你会惊奇的发现,一切都十分简单! 相关文章
标准模板库(STL)介绍
STL使用入门
C++ STL编程轻松入门基础


 

  • Set MYTITLE = STL使用入门( Using STL)
Edit | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r5 < r4 < r3 < r2 < r1 | More topic actions

 

 


 


<script type="text/javascript"> </script> <script src="http://js.tongji.yahoo.com.cn/0/20/116/ystat.js" type="text/javascript"></script> <script language="JavaScript" src="http://trd1.search.cnb.yahoo.com/ystat.do?unit_id=10356&uv=0.73869397445600080.3884463301887492&nuv=0&ss=1205503145_0.106717566228023420.46377361021599783&ref=&url=http%3A//www.stlchina.org/twiki/bin/view.pl/Main/STLUsingSTL&nac=Microsoft%20Internet%20Explorer&agt=Mozilla/4.0%20%28compatible%3B%20MSIE%207.0%3B%20Windows%20NT%205.1%3B%20.NET%20CLR%202.0.50727%29&clr=32-bit&scr=1600x1200&lng=zh-cn&jav=1&flu=9.0&tm=1205444471&tc=68cc5d4f198934cb4e4a9a7d25357ecd&ut=0&cnu=0.331620804279997460.7021643183974915" type="text/javascript"></script> 给我留言

 


 
Powered by TWiki
  •  
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值