使用 STL






4.35/5 (19投票s)
1999 年 12 月 30 日

180616
关于使用标准模板库的简要介绍。
引言
我的 C++ 编程背景来自 DOS Borland C++。 在其最新的 DOS 版本 3.1 中,他们包含了一个用于集合的模板库。 这是一个伟大的作品。 当我开始使用 Visual C++ v2.2 时,我甚至尝试在 Visual C++ 中使用 Borland 的集合模板库,但没有成功。 唯一的其他解决方案是切换到作为 MFC 一部分的 Microsoft 的集合。 然而,这始终是一个问题,原因如下
- 一旦应用程序编写完毕(例如从列表切换到数组),就很难从一种容器类型切换到另一种容器类型。
- 迭代器对于不同类型的容器是不同的。
- 如果有人正在编写 DLL、服务或控制台应用程序,并且需要容器,则解决方案是动态或静态链接 MFC,这使得项目依赖于 MFC。
最近,我开始使用 STL,它很棒。 一开始有点困难,但一旦我掌握了这个想法,就很容易了。 本文包含一些关于 STL 的第一手经验,旨在供希望快速使用 STL 且不深入研究细节的程序员使用。
规则 1
您可以创建存储对象或指向对象的指针的 STL 容器。
class TMyClass; typedef list<TMyClass> TMyClassList; // Stores objects into the list container typedef list<TMyClass*> TMyClassPtrList; // Stores pointers to object into the list container
通常,使用存储对象的列表容器。 但是,如果对象使用机器资源(文件句柄、命名管道、套接字或类似资源),则更适合使用存储指向对象的指针的列表。
如果容器存储对象,则它会在容器销毁期间自动清理。 但是,如果它存储指向对象的指针,则程序员有责任删除所有指针。
规则 2
每个类(其实例将进入容器)必须至少实现复制构造函数(最好也实现赋值运算符)。class TMyClass { private: ... public: TMyClass(..); // Copy constructor TMyClass(const TMyClass& obj) { *this = obj; } // Assignment operator TMyClass& operator=(const TMyClass& obj); ... };
这是必需的,因为当您将对象实例插入容器时,STL 将创建对象的本地副本。 如果您没有为复制构造函数编写正确的代码,则列表中的对象将有一些数据成员未初始化。
规则 3
将对象插入容器的方式如下
TMyClass object; TMyClassList myList; TMyClassList::iterator it; it = myList.insert(myList.end(), object); TMyClass *pObject = &(*it);
前面的示例显示了如何将对象插入容器并获取容器中对象的指针。 这是必要的,因为容器将创建“对象”实例的新副本,并且不再使用原始的“对象”实例。 如果您要将指针存储到列表中,则没有必要,因为原始指针存储在容器中。
规则 4
遍历容器的方式如下
TMyClassList::iterator it; TMyClass *pObject; for (it = myList.begin(); it != myList.end(); it ++) { pObject = &(*it); // Use pObject }
但是,如果您要将指针存储到容器中,则必须将前面的代码片段修改为如下所示
TMyClassList::iterator it; TMyClass *pObject; for (it = myList.begin(); it != myList.end(); it ++) { pObject = *it; // Use pObject }
规则 5
从容器中删除项目的方式如下
TMyClassList::iterator it; TMyClass *pObject; for (it = myList.begin(); it != myList.end(); it ++) { pObject = &(*it); if (pObject satisfies some delete criteria) then myList.erase(it); // If pointers are stored in a list then add delete pObject; }
需要额外的行来删除指向对象的指针,因为容器不会删除存储的指针,因此必须手动删除它。
结论
STL 唯一缺少的是一个类似于 CString::Format()
函数的函数。
我希望本文能为您提供足够的信息来开始使用 STL。 您会惊讶于它有多么容易。