第02篇 ACM/ICPC竞赛之STL简介

来源:互联网 发布:淘宝登陆页面无法显示 编辑:程序博客网 时间:2024/05/16 01:33

一、关于STL

STL(Standard Template Library,标准模板库)是C++语言标准中的重要组成部分。STL以模板类和模板函数的形式为程序员提供了各种数据结构和算法的精巧实现,程序员如果能够充分地利用STL,可以在代码空间、执行时间和编码效率上获得极大的好处。


STL大致可以分为三大类:算法(algorithm)、容器(container)、迭代器(iterator)。

STL容器是一些模板类,提供了多种组织数据的常用方法,例如vector(向量,类似于数组)、list(列表,类似于链表)、deque(双向队列)、set(集合)、map(映象)、stack(栈)、queue(队列)、priority_queue(优先队列)等,通过模板的参数我们可以指定容器中的元素类型。

STL算法是一些模板函数,提供了相当多的有用算法和操作,从简单如for_each(遍历)到复杂如stable_sort(稳定排序)。

STL迭代器是对C中的指针的一般化,用来将算法和容器联系起来。几乎所有的STL算法都是通过迭代器来存取元素序列进行工作的,而STL中的每一个容器也都定义了其本身所专有的迭代器,用以存取容器中的元素。有趣的是,普通的指针也可以像迭代器一样工作。

熟悉了STL后,你会发现,很多功能只需要用短短的几行就可以实现了。通过STL,我们可以构造出优雅而且高效的代码,甚至比你自己手工实现的代码效果还要好。

STL的另外一个特点是,它是以源码方式免费提供的,程序员不仅可以自由地使用这些代码,也可以学习其源码,甚至按照自己的需要去修改它。

下面是用STL写的题1067--Ugly Numbers的代码:


#include <iostream>

#include <queue>

 

using namespace std;

 

typedef pair<unsigned long, int> node_type;

 

main()

{

 unsigned long result[1500];

 priority_queue< node_type, vector<node_type>, greater<node_type> > Q;

 Q.push( make_pair(1, 2) );

 for (int i=0; i<1500; i++)

 {

  node_type node = Q.top(); Q.pop();

  switch(node.second)

  {

  case 2: Q.push( make_pair(node.first*2, 2) );

  case 3: Q.push( make_pair(node.first*3, 3) );

  case 5: Q.push( make_pair(node.first*5, 5) );

  }

  result[i] = node.first;

 }

 

 int n;

 cin >> n;

 while (n>0)

 {

  cout << result[n-1] << endl;

  cin >> n;

 }

 

 return 1;

}

 

 

 

二、使用STL
在C++标准中,STL被组织为以下的一组头文件(注意,是没有.h后缀的!):

algorithm / deque / functional / iterator / list / map

memory / numeric / queue / set / stack / utility / vector

当我们需要使用STL的某个功能时,需要嵌入相应的头文件。但要注意的是,在C++标准中,STL是被定义在std命名空间中的。如下例所示:

#include <stack>

main()

{

    std:: stack<int> s;

    s.push(0);

    ...

    return 1;

}

如果希望在程序中直接引用STL,也可以在嵌入头文件后,用using namespace语句将std命名空间导入。如下例所示:

#include <stack>

using namespace std;

main()

{

    stack<int> s;

    s.push(0);

    ...

    return 1;

}

STL是C++语言机制运用的一个典范,通过学习STL可以更深刻地理解C++语言的思想和方法。在本系列的文章中不打算对STL做深入的剖析,而只是想介绍一些STL的基本应用。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/camel_flying/archive/2009/08/17/4454169.aspx