最近我开始使用STL,发现它真是太棒了!入门可能稍微难一些,但一旦你开始了,它就变得非常容易。本文包含了一些使用STL的入门经验,主要是面向那些希望能快速使用STL又不想了解那些琐碎细节的程序员。
你可以生成STL容器,用来存放对象或者指向对象的指针。
class TMyClass; typedef list<TMyClass> TMyClassList; // 用于存放对象的list容器 typedef list<TMyClass*> TMyClassPtrList; // 用于存放对象指针的list容器 一般来说,list容器用于存放对象。但是,如果你是需要保存一些机器资源(例如,文件句柄,命名管道、套接字(socket)或者其他类似的资源),那么你需要使用list来保存指向这些对象的指针。如果容器是保存的对象,则在容器析构的时候会自动清理这些对象。但,如果它保存的是对象的指针,删除指针就应该是程序员的责任了。
对需要保存到容器中的对象的类型来说,每个类都必须至少实现拷贝构造函数,最好还能重载赋值操作符。
class TMyClass { private: ... public: TMyClass(..); // 拷贝构造函数 TMyClass(const TMyClass& obj) { *this = obj; } // 赋值操作符 TMyClass& operator=(const TMyClass& obj); ... }; 当你把一个对象的实例插入到容器中,STL会自己重新生成一个此对象的拷贝,因此拷贝构造函数就成为必须的了。如果你没有为拷贝构造函数写正确的代码,就有可能造成list中对象的某些数据成员没有初始化。按照下列方式把一个对象插入到容器中:
TMyClass object; TMyClassList myList; TMyClassList::iterator it; it = myList.insert(myList.end(), object); TMyClass *pObject = &(*it); 上面的例子显示了如何把一个对象插入容器中,并得到这个在容器中的对象的指针。由于容器将会为这个对象产生一个新的拷贝,原始的那个对象实例就不再使用了,因此得到其指针是很有必要的。若你是用list来保存指针,这个操作就没有多大必要了,因为原始的指针会被保存到容器中。通过下面的方式,使用迭代器遍历整个容器:
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 }按照下面的方法可以删除容器中的元素:
TMyClassList::iterator it; TMyClass *pObject; for (it = myList.begin(); it != myList.end(); it ++) { pObject = &(*it); if (pObject 满足某些删除的标注) then myList.erase(it); // 若list里面保存的是指针,那么增加下面代码 delete pObject; } 容器不会删除其保存的指针,需要手动删除,因此再上面代码中增加了额外一行。