目前位置: VCer资源中心 >>> VCer文章 >>> C++/MFC基础

[本帖已阅读1518次 分值80 回复0次] 张贴资源 发回信箱 控制面板

STL使用入门( Using STL)

提供者:oases2008 张贴时间:2005-01-01 00:00:00.0 出处:http://www.jblook.cn 作者:不祥

STL使用入门( Using STL)(2005-01-01 00:00:00.0)


oases2008


 
级别: VCer小兵
头衔: VCer会员

经验: 258
作品: 3
分会: 华北分会
注册: 2007-01-25 12:00:19.0
登录: 2007-10-30 16:38:36.0
  • STL使用入门( Using STL)
      [*]0 前面的话(Winter) [*]1 介绍 [*]2 规则
        [*]Rule 1: [*]Rule 2 [*]Rule 3: [*]Rule 4: [*]Rule 5:
      [*]3 结论

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);        // ???可能存在问题,erase后可能影响iterator,在deconstructions时会出错。

        // 若list里面保存的是指针,那么增加下面代码

        delete pObject;

}

容器不会删除其保存的指针,需要手动删除,因此再上面代码中增加了额外一行。

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

本文转载自IT网it求职笔试真题库网

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1000000000315.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

[回复该贴] [加入个人书签]
[投票结果]

A: 评分 10 0% (0 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)