• 转:STL使用入门( Using 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容器,用来存放对象或者指向对象的指针。

    classTMyClass;typedeflist<TMyClass> TMyClassList;// 用于存放对象的list容器typedeflist<TMyClass*> TMyClassPtrList;// 用于存放对象指针的list容器

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

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

    Rule 2

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

    classTMyClass {private:
            ...public:
            TMyClass(..);// 拷贝构造函数TMyClass(constTMyClass& obj)  { *this= obj; }// 赋值操作符TMyClass&operator=(constTMyClass& 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里面保存的是指针,那么增加下面代码deletepObject;
    }

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

    3 结论

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

    英文原文:

    http://www.codeproject.com/Articles/181/Using-STL

  • 相关阅读:
    TextView走马灯
    Android apk安装时出现“解析软件包错误”
    Android Studio调试手机或者安装APK的时候出现install failed test only
    如何动态改变报表的行高列宽
    如何动态的给报表添加目录
    免费报表工具零代码零基础轻松搞定 web 报表
    脚本中如何做填报数据校验
    脚本填报表的条件查询
    脚本模式下的填报表制作
    交叉填报表的制作
  • 原文地址:https://www.cnblogs.com/youxin/p/3281668.html
Copyright © 2020-2023  润新知