65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 STL

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.35/5 (19投票s)

1999 年 12 月 30 日

viewsIcon

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。 您会惊讶于它有多么容易。

© . All rights reserved.