stl就是standard template library,标准模板库。stl现在是c++的一部分,因此不用额外安装什麽。它被内建在你的编译器之内。因为stl的list是一个简单的容器,所以我打算从它开始介绍stl如何使用。如果你懂得了这个概念,其他的就都没有问题了。另外,list容器是相当简单的,我们会看到这一点。
如何定义和初始化一个list?计算它的元素的数量,从一个list里查找元素,删除元素,和一些其他的操作。要作到这些,我们将会讨论两个不同的算法,stl通用算法都是可以操作不止一个容器的,而list的成员函数是list容器专有的操作。
这是三类主要的stl组件的简明纲要。stl容器可以保存对象,内建对象和类对象。它们会安全的保存对象,并定义我们能够操作的这个对象的接口。放在蛋架上的鸡蛋不会滚到桌上。它们很安全。因此,在stl容器中的对象也很安全。我知道这个比喻听起来很老土,但是它很正确。
stl算法是标准算法,我们可以把它们应用在那些容器中的对象上。这些算法都有很着名的执行特性。它们可以给对象排序,删除它们,给它们记数,比较,找出特殊的对象,把它们合并到另一个容器中,以及执行其他有用的操作。
stl iterator就象是容器中指向对象的指针。stl的算法使用iterator在容器上进行操作。iterator设置算法的边界 ,容器的长度,和其他一些事情。举个例子,有些iterator仅让算法读元素,有一些让算法写元素,有一些则两者都行。 iterator也决定在容器中处理的方向。
你可以通过调用容器的成员函数begin()来得到一个指向一个容器起始位置的iterator。你可以调用一个容器的 end() 函数来得到过去的最后一个值(就是处理停在那的那个值)。
这就是stl所有的东西,容器、算法、和允许算法工作在容器中的元素上的iterator。 算法以合适、标准的方法操作对象,并可通过iterator得到容器精确的长度。一旦做了这些,它们就在也不会“跑出边界”。 还有一些其他的对这些核心组件类型有功能性增强的组件,例如函数对象。我们将会看到有关这些的例子,现在 ,我们先来看一看stl的list。
定义一个list
我们可以象这样来定义一个stl的list:
#include <string> #include <list> int main (void) { list<string> milkshakes; return 0; }
这就行了,你已经定义了一个list。简单吗?list<string> milkshakes这句是你声明了list<string>模板类 的一个实例,然后就是实例化该类的一个对象。但是我们别急着做这个。在这一步其实你只需要知道你定义了 一个字符串的list。你需要包含提供stl list类的头文件。我用gcc 2.7.2在我的linux上编译这个测试程序,例如:g++ test1.cpp -o test1 注意iostream.h这个头文件已经被stl的头文件放弃了。这就是为什么这个例子中没有它的原因。
现在我们有了一个list,我们可以看实使用它来装东西了。我们将把一个字符串加到这个list里。有一个非常 重要的东西叫做list的值类型。值类型就是list中的对象的类型。在这个例子中,这个list的值类型就是字符串,string , 这是因为这个list用来放字符串。
使用list的成员函数push_back和push_front插入一个元素到list中:
#include <string> #include <list> int main (void) { list<string> milkshakes; milkshakes.push_back(”chocolate”); milkshakes.push_back(”strawberry”); milkshakes.push_front(”lime”); milkshakes.push_front(”vanilla”); return 0; }
我们现在有个4个字符串在list中。list的成员函数push_back()把一个对象放到一个list的后面,而 push_front()把对象放到前面。我通常把一些错误信息push_back()到一个list中去,然后push_front()一个标题到list中, 这样它就会在这个错误消息以前打印它了。
the list member function empty()list的成员函数empty()
知道一个list是否为空很重要。如果list为空,empty()这个成员函数返回真。 我通常会这样使用它。通篇程序我都用push_back()来把错误消息放到list中去。然后,通过调用empty() 我就可以说出这个程序是否报告了错误。如果我定义了一个list来放信息,一个放警告,一个放严重错误, 我就可以通过使用empty()轻易的说出到底有那种类型的错误发生了。
我可以整理这些list,然后在打印它们之前,用标题来整理它们,或者把它们排序成类。
/* || using a list to track and report program messages and status */ #include <iostream.h> #include <string> #include <list> int main (void) { #define ok 0 #define info 1 #define warning 2 int return_code; list<string> infomessages; list<string> warningmessages; // during a program these messages are loaded at various points infomessages.push_back(”info: program started”); // do work… warningmessages.push_back(”warning no customer records have been found”); // do work… return_code = ok; if (!infomessages.empty()) { // there were info messages infomessages.push_front(”informational messages:”); // … print the info messages list, we’ll see how later return_code = info; } if (!warningmessages.empty()) { // there were warning messages warningmessages.push_front(”warning messages:”); // … print the warning messages list, we’ll see how later return_code = warning; } // if there were no messages say so. if (infomessages.empty() && warningmessages.empty()) { cout << “there were no messages ” << endl; } return return_code; }











