STL简介

前言

本篇文章是作者本人使用STL 后的一些看法, 对於想要靠此文章学习STL, 是不可能的. 建议叁后面介绍的一些书入门.

STL的概念

在STL 中, 大至上分三个主要的功能. 分别是collect class, (例如 vector ,list , .....), 算法部份(如sort ,find ...), 最是一些工具(如auto_ptr , make_pair ....), 其中以collect class 和算法部份最为重要.

STL 使用一种称作 iterator (中文有人翻作泛型指标) 的资料类型来连接collect class 和算法部份. 为了达到能够重复使用算法和collect class. 在STL 中把这些东西更进一步抽象化. 因此STL订义了一堆抽象化的行为称作concept. 您可以想像concept 是在说明一些行为. 只要某一个型别合乎concept 中说明的行为. 就说此类型具有此concept.

举例说明, 如有concept C1,C2. 算法A1, A2. 资料类型D1 具有C1 的行为,D2 有C1,C2.

如A1 要求需要具有C1 的型别. 则任何一个有C1 的资料类型都可以给A1 使用. 在此例中有D1和D2.

如A2 要求具有C1跟C2的型别. 在此只有D2 可以给A2 使用.

STL 使用抽象化的行为定义且实作它们, 来达到算法和资料类型的重复使用.

iterator 在STL 中是很重要的一个概念, iterator 和C 的point 很相, 但他不是指标(note 在某一些状况下iterator 是以C 的point 来实作). 他提供类似point 的功能, 如 '++' 运算表示把iterator 移到下一个element , '*' 运算表示存取iterator 目前指向的element (在此使用'指向'并不是很好). 利用iterator 你可以走访整个collect 中存放的内容.

举个例子说明iteraotr 的功能吧.

vector 是STL 中众多的collect class 中的一种. vector 提供begin() 和end() 这类的member function 来取得vector 中第一个element 的iterator, 和最后一个element的下一个element. 您可以这样使用:

std::vector<int> vtInt;
vtInt.push_back(1);
...
.. // 假设对vtInt 做了很多不同的动做, 如push_back ...
std::vector<int>::iterator itBegin=vtInt.begin();
std::vector<int>::iterator itEnd=vtInt.end();
for( ; itBegin != itEnd ;++itBegin) // 走访itBegin 到 itEnd 不含itEnd 之间的所有element
{
int x=*itBegin; // 取得itBegin 指向的资料
*itBegin = .... ; // 存放资料到itBegin 指向的资料
}

由此例中iterator 有和C point 类似的功能.

机乎所有的STL 的算法都会要求输入的资料是itearot 如sort 算法, 要求输入两个iterator , 然后把这两个iterator 之间的资料加以排序. 介由引进iterator , sort 可以排序的东西就变多了.

使用范例

I. 在STL 中使用标准输出. Say Hello

#include <iostream> // STL 的输入输出包含档. 在STL 中都没有使用.h or .hpp 等副档名
int main(int argc,char* argv[])
{
std::cout << "Hello!! This is STL " << std::endl; // 使用stl 的标准输出, std 是STL 的namespace 所以要这样用std::cout
return 0;
}

II. 从标准输入读入字串, 排序后再输出

#include <iostream> // STL 的输入输出包含档
#include <algorithm> // STL 的算法包含档
#include <string> // STL 的字串
#include <vector> // STL 的一个collect class 这是一个像阵列的class
const int d_nReadLine=5;
int main(int argc,char* argv[])
{
std::vector<std::string> vtString; // 宣告一个字串vector
std::string strTemp; // 宣告一个字串
for( int i = 0 ; i < d_nReadLine ; i++) // 读取d_nReadLine 个字串并将结果存到vtString 中
{
std::cin >> strTemp; // 读入字串
vtString.push_back(strTemp); // 将读入的字串存到vtString 的最后面
}
std::sort(vtString.begin(),vtString.end()); // 将vtString 中得资料sort
std::copy(vtString.begin(),vtString.end(),
std::ostream_iterator<std::string>(std::cout,"\n")); // 将vtString 中得资料输出
return 0;
}

note :

std::sort 和std::copy 都是STL 提供的算法.

参考书籍

泛型程式设计与STL, Generic Programming and the STL. Matthew H. Austern 着, 侯捷/黄俊尧 译

时间: 2024-09-15 16:10:35

STL简介的相关文章

C++ STL简介

一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Musser在惠普实验室工作时所开发出来的.现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的代码从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比

C++语言基础 例程 STL简介

贺老师的教学链接  本课讲解 vector容器类示例 #include <iostream> #include <vector> using namespace std; int main() { int a[] = {2,3,4}; vector<int> v1; vector<int>::iterator iter; //插入元素 v1.insert(v1.begin(),1,1); v1.insert(v1.begin(),a,a+3); v1.ins

【温故而知新】C和C++4:STL概览

一.STL简介 1.什么是STL: 标准模板库(Standard Template Library , STL)是一个C++通用库,其目的在于将组建标准化,节省开发者的时间和精力.从组织上来看,STL可分为六大部分,分别是迭代器(iterators).算法(algorithms).容器(container).函数对象(function object).内存分配器(allocator)和配接器(adapter).其中的代码采用了模板类和模板函数实现,极大地提高了编程效率.STL相对于传统的编程方法

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

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

《C++语言基础》网络课程主页

返回 贺利坚教学链接 本课程是在大学的实体课程基础上建设的一门网络课程,将我在教学中建设的资源,让更多的人能够用到. 课程链接是:点击打开链接 同步实体课在 点击打开链接,那里有92名同时学习的"同学",以及他们的博客链接. 坚持这门课程学习的学员,请在评论处留言,我将建立专门的链接,一起建设学习的氛围. 学员链接:(待加) 课程内容 一.从C到C++ 课时 视频 示例程序 自测 学习指导与实践 实践项目参考解答 1.1 由C语言到C++(暨本课介绍) 链接   1.2 C语言的基本成

C++程序设计课程主页-2014级

前言 我和我的2014级学生将开始"程序设计基础"课程的学习,学习内容主要是C++程序设计,做本文标题延续前三届的称谓. 将"代码积累看得见"的优势将继续发挥,借助于前三年的积累,再加上新的尝试,期待再有突破. 我们的做法 借助于博客,我们将继续将"积累代码行"的实践进行下去,详见论文<利用博客提交作业的程序设计课程实践模式>. 前三级的课程主页分别是:2011级  2012级 2013级,关于这三个年级的学习情况总结,见 2011级

《C++程序设计入门同步实践宝典 》可以下载了

<C++程序设计入门同步实践宝典>可以告一段落了.这是假期计划之外的事情,不小心又花了近二十天的时间,其他计划中的事情得一一落实了.将此版定为0.5版,以后还会有不小的改动. 下载地址:http://download.csdn.net/detail/sxhelijian/4482514 下载需要资源分5分,以对自己辛苦一番有所表示.常在CSDN泡的同学,也应该分享些你的原创挣点积分了.缺少积分的穷孩子,也可以给我留言,提供Email寄过去. 发个封皮: 有人提出上目录,好主意: 完工后写的前言

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

STL中sort函数用法简介

 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错.STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n).使用这个函数,需要包含头文件.     这个函数可以传两个参数或三个参数.第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址.也就是说,排序的区间是[a,b).简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort