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

转:STL使用入门( Using STL)的更多相关文章

  1. 【转】C++ STL快速入门

    转自:https://www.cnblogs.com/skyfsm/p/6934246.html 冠军的试炼 悟已往之不谏,知来者之可追 博客园 首页 新随笔 联系 订阅 管理 随笔 - 60  文章 ...

  2. C++ STL标准入门

    C++:STL标准入门汇总 第一部分:(参考百度百科) 一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexand ...

  3. 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系

    2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...

  4. STL非变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...

  5. C++ STL快速入门

    在数月之前的机试中第一次体验到STL的威力,因为自己本来一直在用C语言做开发,很多数据结构都是自己造的,比如链表.队列等,第一次接触C++ STL后发现这些数据结构都已经给我提供好了,我直接拿去调用就 ...

  6. 『C++』STL容器入门

    最近在学习opencv,因为C++基础很烂,所以遇到了不少问题,其中STL模块也是没少接触,特此简单了解一下STL的容器类型(主要是Vector)和迭代器的简单用法. C++ STL(标准模板库)是一 ...

  7. c++stl应用入门

    在这篇中,我会讲几个简单易懂且比较常用的stl函数,这些函数在noip系列考试中往往被允许使用(既然让用我们自然不用手码了...) (末尾有惊喜!) 1.sort 绝大部分刚入门的oier第一个接触的 ...

  8. C++STL快速入门学习

    C++ STL中最基本以及最常用的类或容器无非就是以下几个: string vector set list map 下面就依次介绍一下它们,并给出一些最常见的使用方法,做到最快入门. string 首 ...

  9. (转载)C++:STL标准入门汇总

    (转载)http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html 学无止境!!! 第一部分:(参考百度百科) 一.STL简介 S ...

随机推荐

  1. android 围绕中心旋转动画

    本文主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 ...

  2. java 在方法中新建线程,传参和加锁详解

    在实际开发中,往往在基本两三种创建线程的方法之外,还用到一个简单的创建线程调用方法的情况,代码如下: public void deleteRedisData(RedisKey redisKey){ n ...

  3. BZOJ 2751: [HAOI2012]容易题(easy)( )

    有限制的最多就K个, 所以我们处理一下这K个就行了. 其他可以任选, 贡献都是∑i (1≤i≤N), 用快速幂. ------------------------------------------- ...

  4. BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

    最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...

  5. C++的常量折叠(二)

    前面的C++的常量折叠(一)的最后留下了一个问题,那就是在声明i的时候,加上修饰符volatile关键字,发现结果输出的就不一样了,下面来说一下volatile这个关键字. C/C++中的volati ...

  6. 我用过的Linux命令--关闭防火墙

    关闭防火墙: 防火墙的弄能是限制某一些端口的使用,可以通过linux命令关系它,相应的指令: 查看防火墙信息: #service iptables status 就能看到防火墙的状态: 关闭防火墙: ...

  7. 将默认首页设置成index.do的方法

    变态欺骗法,今天csdn一个前辈的,学习了,公司服务器是weblogic的,也可以欺骗. 但是我又非常迫切.非常盼望.非常渴望使用index.do做首页,怎么办? Tomcat中用一段注释: When ...

  8. 电感耦合非接触IC卡系统的EMI问题

    射频识别(RFID)技术近年来发展迅速,并获得了广泛应用.但作为一种无线射频技术,其电磁兼容(EMC)性能也越来越受到人们的关注.RFID涉及的频率范围甚广,包括低于135kHz.13.56MHz.4 ...

  9. rsync、ssh备份

    Linux系统需求 为了实现这个备份程序,需要准备一个外部驱动器.您可以将备份写到一个外部USB磁盘,但这样做效率不高.因此,我假设您将备份写到位于网络某处的服务器中.这台服务器要为带有SSH和rsy ...

  10. Android开发中怎样调用系统Email发送邮件(多种调用方式)

    在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...