标准模板库介绍

标准模板库,也叫 STL,是一个 C++ 容器类库,算法和迭代器。他提供许多 基本算法,数据结构。STL 是一个通用库,即可以充份定制:几乎所有的 STL 组件都是模板。在你使用 STL 前,你必须了解模板的工作情况。

容器和算法

和许多类库一样,STL 包含容器类 - 可以包含其他对象的类。STL 包含向量 类,链表类,双向队列类,集合类,图类,等等。他们中的每个类都是模板,能包含 各种类型的对象。例如,你可以用 vector<int> ,就象常规的 C 语 言中的数组,除了 vector 不要你象数组那样考虑到动态内存分配的问题。

vector<int> v(3); // 定义一个有三个元素的向量类
v[0] = 7;
v[1] = v[0] + 3;
v[2] = v[0] + v[1]; // v[0] == 7, v[1] == 10, v[2] == 17

 STL 还包含了大量的算法。他们巧妙地处理储存在容器中的数据。你能够颠倒 vector 中的元素,只是简单使用 reverse 算法。

reverse(v.begin(), v.end()); // v[0] == 17, v[1] == 10, v[2] == 7

在调用 reverse 的时候有两点要注意。首先,他是个全局函数,而不是成员 函数。其次,他有两个参数,而不是一个:他操作一定范围的元素而不是操作容器。 在这个例子中他正好是对整个容器 V 操作。

以上两点的原因是相同的:reverse 和其他 STL 算法一样,他们是通用的,也就 是说, reverse 不仅可以用来颠倒向量的元素,也可以颠倒链表中元素的顺序。 甚至可以对数组操作。下面的程序是合法的。

double A[6] = { 1.2, 1.3, 1.4, 1.5, 1.6, 1.7 };
reverse(A, A + 6);
for (int i = 0; i < 6; ++i)
cout << "A[" << i << "] = " << A[i];

 这个例子也用到了范围,和我们上面的向量的例子一样:第一个参数是指向要操作的 范围的头的指针,第二个参数是指向尾的指针。在这里,范围是 [A, A + 6)。可能 你注意到范围的不对称。

迭代器

在上面的 C 数组的例子中,reverse 的参数类型是 double*。那么在 向量 或链表中参数又是什么呢?也就是说,究竟 reverse 是 如何定义参数的,并且 v.begin() 和 v.end() 返回什么?

问题的答案是 reverse 的参数是 迭代器 (iterators)。他是指针的概括。 指针自己也是迭代器。这也是为什么可以颠倒数组中元素的顺序的原因。同样地,向量 定义了嵌套的类型 iterator 和 const_iterator。在上面的例子中, v.begin() 和 v.end() 返回的类型是 vector<int>::iterator。 还有一些迭代器,如 istream_iterator 和 ostream_iterator。他们根本不能和容器关联。

迭代器的出现让算法和容器的分离成为可能。算法是模板,其类型依赖于迭代器,因此不会局 限于单一的容器。例如,我们写个算法实现在一定范围的线性查找。下面就是 STL 的 find 算法。

template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value) {
while (first != last && *first != value) ++first;
return first;
}

 Find 有三个参数:两个迭代器定义范围,第三个是要查找的值。他遍历范围 [first, last),从头到尾的处理,在找到后停止或到范围的最后停止。

First 和 last 定义为 InputIterator 类型, 而 InputIterator 是个模板参数。也就是说,实际上没有一个真实的类型 InputIterator:当你调用 find 时,编译器用实际的类型 去匹配 InputIterator 和 T。如果 find 的两个参数 中第一个实现是 int*,第三个实现是 int,那么你可以认为是在执行 下面的函数。

int* find(int* first, int* last, const int& value) {
while (first != last && *first != value) ++first;
return first;
}

时间: 2024-08-02 11:45:06

标准模板库介绍的相关文章

STL学习系列之二:标准模板库(STL)介绍

此文为转贴文章,由于原文运行在Linux下,我在vc6/7下进行调试,作了部分修改!注意:所有的代码在vc6/vc7下调试通过!标准模板库(STL)介绍 标准模板库(STL)介绍 0 前言. 1 定义一个list 2 使用list的成员函数push_back和push_front插入一个元素到list中 3 list的成员函数empty() 4 用for循环来处理list中的元素 5 用STL的通用算法for_each来处理list中的元素 6 用STL的通用算法count_if()来统计lis

STL学习系列之一——标准模板库STL介绍

库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的分离,非面向对象本质.访问对象是通过象指针一样的迭代器实现的: 容器是象链表,矢量之类的数据结构,并按模板方式提供: 算法是函数模板,用于操作

入门教程:JSP标准模板库(上)

js|标准|教程|模板|入门教程 简介JSP标准模板库(JSTL)是SUN公司发布的一个针对JSP开发的新组件.JSTL允许你使用标签(tags)来进行JSP页面开发,而不是使用多数JSP程序员已经习惯了的scriptlet代码方式开发.JSTL几乎能够做到传统JSP scriptlet代码能做的任何事情.你可能会疑惑,为什么我们需要另一种这样的HTML生成语言呢? STL允许JSP程序员使用tags而不是JAVA代码来编程.为了展示为什么这个是更优越的,下面将给出示例.我们会检查一个非常简单的

用标准模板库STL实现文件比较

要阅读本文,你要熟悉C++,熟悉类模板和函数模板.本文汇集了大量有关的信息,指引你逐步阅读. 本文用提问,设计和解决方案引导阅读.希望你能喜欢. 问题提出: 有二篇文章都含有许多行文字.我们要建立一个程序来找出二者之间的不同之处并将这些不同内容的行显示出来.程序必须做成可重复使用的组件,就是说,这个组件能够未经修改地被其他程序使用. 设计: 假设这二个文件非常之大(每个文件都有数千行),我们这样设计有关解决方案: 将各个文件读进内存块, 在内存块中进行文件内容比较, 将不同之处放进一个新的第三个

C++标准库和标准模板库

C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费时间.人力重新开发呢:(2)质量:标准库的都是经过严格测试的,正确性有保证:(3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平:(4)良好的编程风格:采用行业中普遍的做法进行开发. 在C++程序设计课程中,尤其是作为第一门程序设计课程,我们注重了语法.语言的

C++标准模板库与数据结构的学习

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中极具革命性的一部分.该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性. 体验STL中的list STL中提供的list类,是一个双向循环链表类.从每一个元素(节点),都可以访问前面一个元素

入门教程:JSP标准模板库(下)

js|标准|教程|模板|入门教程 JSTL标签库JSTL通常被认为是一种单标签库.但JSTL实际上有4个标签库.这些标签库被概括为如下: 核心标签库?包含一些Web应用的必要的标签.核心标签库的实例包括循环,表达式赋值和基本输入输出.. 格式化/国际化标签库?包括被用来解析数据的标签库.这种标签会解析数据,比如日期,不同的场所区域等. 数据库标签库?包含被用来访问SQL数据库的标签.这些标签通常仅仅只创建原形(prototype)程序.这个是因为大多数程序不会直接从JSP页面中来处理数据库访问.

一步一步学STL标准模板库

list 的使用 在使用list必须包括头文件#include <list>, 1).如何定义一个list对象 #include <list> int main (void) { list<char > cList; //声明了list<char>模板类 的一个实例 } 2).使用list的成员函数push_back和push_front插入一个元素到list中 cList. push_back('a'); //把一个对象放到一个list的后面 cList.

【C/C++学院】(12)C++标准模板库STL

1.简介          STL的代码从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器).  2.vector向量 #include "iostream" #include "vector" using namespace std; //== != [] = //(vector<int>模板类型 void printfArray(vector<int> &v) { int size