STL泛型编程宁波大学大学生软件实训基地陈叶芳目录•概述•Vector向量容器•string基本字符系列容器•set集合容器•deque双端队列容器•list双向链表容器•stack堆栈容器•queue队列容器概述•C++STL(StanardTemplateLibrary):C++标准模板库,又称C++泛型库。定义了常用的数据结构和算法。•泛型程序设计:将程序尽可能写得通用。•STL提供三种类型组件:容器——标准类模板迭代器——通用类型指针算法概述•容器类的对象包含一组元素,这组元素又同是一种类的对象。•数组\基本顺序表都是容器类.•一个整型数组和一个字符型数组,是数组容器类的两个对象,即两个容器,整型数组容器和字符数组容器.•七种基本容器:–向量(vector)、队列(deque)、列表(list)、串(string):顺序容器,一系列元素的有序集合–集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap):关联容器,包含查找元素的键值。概述•迭代器的作用:遍历容器。•STL算法库:排序算法,不可变序算法,变序性算法,数值算法。概述//用向量容器装入10个数,用accumulate算法统计和#includeiostream#includevector//向量需要#includenumeric//算法需要usingnamespacestd;intmain(){vectorintv;//定义向量vinti;for(i=0;i10;i++)v.push_back(i*i);vectorint::iteratorit=v.begin();for(;it!=v.end();it++)cout*it;coutendl;coutaccumulate(v.begin(),v.end(),0)endl;return0;}Vector向量容器•vector向量容器:对元素随机访问;在尾部插入元素;可以替代数组。•Vector:内存自动管理,在插入删除元素时动态调整所占空间。•#includevector•begin():返回首元素位置的迭代器。•end():返回最后一个元素的下一元素位置的迭代器。Vector向量容器•创建vector对象常用的三种方式:(1)不指定元素个数vectorintv;(2)指定容器大小(元素格式)vectorintv(10);元素下标0~9,初始值0(3)指定容器大小及初始值vectorintv(10,8.1);元素下标0~9,初始值都是8.1Vector向量容器•尾部元素扩张push_back()#includeiostream#includevector//向量需要usingnamespacestd;intmain(){vectorintv;//定义向量vv.push_back(2);v.push_back(8);v.push_back(10);//输出语句return0;}Vector向量容器•下标访问vector元素inti;vectorintv;//定义向量vv.push_back(2);//v[0]=2v.push_back(8);//v[1]=8v.push_back(10);//v[2]=10for(i=0;i3;i++)coutv[i];Vector向量容器•用迭代器访问vector元素vectorintv;v.push_back(2);v.push_back(8);v.push_back(10);vectorint::iteratorit;//定义迭代器变量for(it=v.begin();it!=v.end();it++)cout*it“”;//输出迭代器上元素值Vector向量容器•元素的插入insert()vectorintv(3);v[0]=2;v[1]=7;v[2]=9;v.insert(v.begin(),8);//插入到最前面v.insert(v.begin()+2,1);//在第2个元素前插入v.insert(v.end(),3);//在末尾插入vectorint::iteratorit;//定义迭代器变量for(it=v.begin();it!=v.end();it++)cout*it;Vector向量容器•元素的删除•erase():删除迭代器所指的一个元素或一段区间中的所有元素•clear():一次性删除vector中所有元素Vector向量容器•元素的删除inti;vectorintv(10);for(i=0;i10;i++)v[i]=i;v.erase(v.begin()+2);//删除第2个元素//输出013456789v.erase(v.begin()+1,v.begin()+5);//删除区间内的元素vectorint::iteratorit;for(it=v.begin();it!=v.end();it++)cout*it;//06789Vector向量容器•使用reverse反向排列算法(头文件algorithm):可将某段迭代器区间元素反向排列。#includeiostream#includevector#includealgorithmusingnamespacestd;intmain(){inti;vectorintv(10);for(i=0;i10;i++)v[i]=i;reverse(v.begin()+2,v.end());vectorint::iteratorit;for(it=v.begin();it!=v.end();it++)cout*it;return0;}Vector向量容器•使用sort算法排序:默认升序#includeiostream#includevector#includealgorithmusingnamespacestd;intmain(){inti;vectorintv;for(i=0;i10;i++)v.push_back(9-i);for(i=0;i10;i++)coutv[i];coutendl;sort(v.begin(),v.end());for(i=0;i10;i++)coutv[i];return0;}Vector向量容器•计算向量大小•size():返回元素个数•empty():返回向量是否为空inti;vectorintv(10);for(i=0;i10;i++)v[i]=i;coutv.size()endl;//元素个数10coutv.empty()endl;//0表示向量非空v.clear();coutv.empty()endl;//1表示向量空string基本字符系列容器•vectorchar向量也可以处理字符串,但string更方便。•string:字符串类,提供添加、删除、替换、查找和比较等。(头文件#includestring)•创建string对象。#includestring#includeiostreamusingnamespacestd;intmain(){strings;couts.length()endl;return0;}string基本字符系列容器•给string对象赋值•(1)直接给字符串对象赋值strings;s=“helloC++STL!”coutsendl;•(2)把字符指针赋给一个字符串对象strings;charss[100];scanf(“%s”,ss);//scanf不支持string对象s=ss;string基本字符系列容器•从string对象尾部添加一个字符:用符号+.strings;s=s+’a’;s=s+’b’;s=s+’c’:coutsendl;string基本字符系列容器•从string对象尾部追加字符串:用符号+或append().strings;s=s+”abc”;//abcs=s+”123”;//abc123strings;s.append(“abc”);s.append(“123”);string基本字符系列容器•给string对象插入字符:insert().strings;s=”123456”;string::iteratorit;it=s.begin();s.insert(it+1,’p’);//1p23456string基本字符系列容器•访问string对象的元素:下标法strings;s=“abc123456”;couts[0]endl;string基本字符系列容器•替换string对象的字符:replace()strings;s=“abc123456”;s.replace(3,3,”good”);//从第3个开始,连续的3个字符替换成”good”coutsendl;//abcgood456string基本字符系列容器•搜索string对象的元素或子串:find(),找到则返回下标,否则返回4294967295strings;s=catdogcat;couts.find('a')endl;//查找字符'a'couts.find(dog)endl;//查找子串couts.find(dogc)endl;stack堆栈容器•#includestack•入栈:push()•出栈:pop()•栈顶元素:top()•判断栈空:empty()•元素个数:size()stack堆栈容器#includeiostream#includestackusingnamespacestd;intmain(){stackints;s.push(1);s.push(2);s.push(3);s.push(9);couts.top()endl;//读栈顶元素couts.size()endl;//返回元素个数couts.empty()endl;//判断是否空while(s.empty()!=true)//栈非空{couts.top();//读栈顶元素s.pop();//出栈,删除栈顶元素}return0;}queue队列容器•#includedeque•入队:push()•出队:pop()•读取队首元素:front()•读取队尾元素:back()•empty(),size()queue队列容器#includeiostream#includequeueusingnamespacestd;intmain(){queueintq;q.push(1);q.push(2);q.push(3);q.push(9);coutq.front()endl;//读队首元素coutq.back()endl;//读队尾元素while(q.empty()!=true)//栈非空{coutq.front();q.pop();//队首元素出队}return0;}