《STL泛型编程》课件-探索C++标准模板库的奥妙_第1页
《STL泛型编程》课件-探索C++标准模板库的奥妙_第2页
《STL泛型编程》课件-探索C++标准模板库的奥妙_第3页
《STL泛型编程》课件-探索C++标准模板库的奥妙_第4页
《STL泛型编程》课件-探索C++标准模板库的奥妙_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《STL泛型编程》PPT课件——探索C++标准模板库的奥妙什么是STL?C++标准模板库STL是C++标准模板库(StandardTemplateLibrary)的缩写,它是一组强大的C++模板类和函数,提供了一套通用的数据结构和算法。泛型编程STL采用泛型编程的理念,这意味着其代码可以独立于特定数据类型,适用于各种数据类型,提高了代码的可重用性和灵活性。STL的核心组件1容器容器用于存储数据,提供各种数据结构,如数组、列表、集合、映射等。2迭代器迭代器提供对容器元素的访问方式,允许遍历容器中的元素,并进行操作。3算法算法提供对容器中的数据进行操作,如排序、查找、插入、删除等。4函数对象函数对象允许将函数作为参数传递给算法,以便实现自定义行为。容器序列容器存储元素的顺序,例如:数组、向量、链表、双端队列。集合容器存储元素的集合,例如:集合、映射。适配器对容器进行包装,以提供不同的接口,例如:堆栈、队列、优先队列。迭代器1输入迭代器只能读取容器元素,一次只能读取一个元素。2输出迭代器只能写入容器元素,一次只能写入一个元素。3前向迭代器可以读取和写入容器元素,只能向前遍历。4双向迭代器可以读取和写入容器元素,可以向前或向后遍历。5随机访问迭代器可以读取和写入容器元素,可以随机访问任何位置的元素。算法变更序列操作容器中的元素顺序,例如:排序、插入、删除。查找在容器中查找特定元素,例如:find、search。排序对容器中的元素进行排序,例如:sort、stable_sort。排列组合生成排列或组合,例如:next_permutation、prev_permutation。数值计算执行数值计算,例如:accumulate、inner_product。集合操作执行集合操作,例如:set_intersection、set_union。函数对象函数对象将函数行为封装成对象,可以作为参数传递给算法。1自定义排序可以使用函数对象实现自定义排序规则,例如:根据特定条件对元素进行排序。2Lambda表达式Lambda表达式提供一种简洁的方式来定义函数对象,使其更易于使用。3序列容器数组固定大小的连续内存区域,用于存储元素,可以通过索引访问元素。向量动态大小的连续内存区域,用于存储元素,可以通过索引访问元素,并提供动态内存管理。链表元素存储在节点中,每个节点包含数据和指向下一个节点的指针,提供高效的插入和删除操作。双端队列可以从两端插入和删除元素,提供队列和堆栈的功能。数组#include<array>std::array<int,5>arr={1,2,3,4,5};//访问元素intfirst=arr[0];//修改元素arr[1]=10;向量#include<vector>std::vector<int>vec={1,2,3};//插入元素vec.push_back(4);//删除元素vec.erase(vec.begin()+1);//访问元素intthird=vec[2];链表#include<list>std::list<int>lst={1,2,3};//插入元素lst.insert(lst.begin(),0);//删除元素lst.erase(lst.begin());//访问元素intfirst=lst.front();双端队列#include<deque>std::deque<int>deq={1,2,3};//从前面插入元素deq.push_front(0);//从后面删除元素deq.pop_back();//访问元素intlast=deq.back();集合容器集合存储唯一元素的集合,不保留元素的顺序。映射存储键值对,每个键对应一个唯一的值。集合#include<set>std::set<int>st={1,2,3,2};//重复元素会被忽略//插入元素st.insert(4);//删除元素st.erase(2);//检查元素是否存在boolcontains=st.count(3);映射#include<map>std::map<std::string,int>mp={{"apple",1},{"banana",2}};//插入元素mp["orange"]=3;//修改元素mp["banana"]=5;//访问元素intappleCount=mp["apple"];适配器堆栈适配器对容器进行包装,提供后进先出(LIFO)的接口。队列适配器对容器进行包装,提供先进先出(FIFO)的接口。优先队列适配器对容器进行包装,提供根据优先级排序的接口。堆栈#include<stack>std::stack<int>stk;//压栈stk.push(1);stk.push(2);//弹栈stk.pop();//获取栈顶元素inttop=stk.top();队列#include<queue>std::queue<int>que;//入队que.push(1);que.push(2);//出队que.pop();//获取队首元素intfront=que.front();优先队列#include<queue>//定义优先队列,使用大根堆排序std::priority_queue<int>pq;//插入元素pq.push(1);pq.push(3);pq.push(2);//获取优先级最高的元素inttop=pq.top();迭代器失效迭代器失效原因迭代器失效是指迭代器不再指向有效的内存位置,通常发生在容器被修改时,例如:插入、删除元素。避免迭代器失效可以使用安全的迭代器,或者在修改容器后重新获取迭代器。迭代器分类1输入迭代器只能读取容器元素,一次只能读取一个元素,用于单次遍历。2输出迭代器只能写入容器元素,一次只能写入一个元素,用于将元素写入容器。3前向迭代器可以读取和写入容器元素,只能向前遍历,用于单次遍历和部分修改。4双向迭代器可以读取和写入容器元素,可以向前或向后遍历,用于双向遍历和部分修改。5随机访问迭代器可以读取和写入容器元素,可以随机访问任何位置的元素,用于高效的随机访问和修改。输入迭代器#include<iostream>#include<vector>#include<iterator>intmain(){std::vector<int>vec={1,2,3};std::vector<int>::iteratorit=vec.begin();//使用输入迭代器读取元素std::cout<<*it<<std::endl;//输出:1//输入迭代器只能读取元素,无法修改//*it=5;//编译错误return0;}输出迭代器#include<iostream>#include<vector>#include<iterator>intmain(){std::vector<int>vec(3);//初始化一个大小为3的向量std::vector<int>::iteratorit=vec.begin();//使用输出迭代器写入元素*it=1;//写入第一个元素++it;//移动到下一个位置*it=2;//写入第二个元素++it;//移动到下一个位置*it=3;//写入第三个元素//输出向量元素for(inti:vec){std::cout<<i<<"";//输出:123}return0;}前向迭代器#include<iostream>#include<list>#include<iterator>intmain(){std::list<int>lst={1,2,3};std::list<int>::iteratorit=lst.begin();//使用前向迭代器读取元素std::cout<<*it<<std::endl;//输出:1//使用前向迭代器修改元素*it=5;//修改第一个元素//使用前向迭代器向前遍历++it;//移动到下一个位置std::cout<<*it<<std::endl;//输出:2//前向迭代器只能向前遍历,无法向后遍历//--it;//编译错误return0;}双向迭代器#include<iostream>#include<list>#include<iterator>intmain(){std::list<int>lst={1,2,3};std::list<int>::iteratorit=lst.begin();//使用双向迭代器读取元素std::cout<<*it<<std::endl;//输出:1//使用双向迭代器修改元素*it=5;//修改第一个元素//使用双向迭代器向前遍历++it;//移动到下一个位置std::cout<<*it<<std::endl;//输出:2//使用双向迭代器向后遍历--it;//移动到上一个位置std::cout<<*it<<std::endl;//输出:5return0;}随机访问迭代器#include<iostream>#include<vector>#include<iterator>intmain(){std::vector<int>vec={1,2,3};std::vector<int>::iteratorit=vec.begin();//使用随机访问迭代器读取元素std::cout<<*it<<std::endl;//输出:1//使用随机访问迭代器修改元素*it=5;//修改第一个元素//使用随机访问迭代器随机访问元素it+=2;//移动到第三个位置std::cout<<*it<<std::endl;//输出:3//使用随机访问迭代器进行比较if(it<vec.end()){//迭代器未到达容器末尾}return0;}算法概览变更序列对容器中的元素进行排序、插入、删除等操作。查找在容器中查找特定元素,例如:find、search。排序对容器中的元素进行排序,例如:sort、stable_sort。排列组合生成排列或组合,例如:next_permutation、prev_permutation。数值计算执行数值计算,例如:accumulate、inner_product。集合操作执行集合操作,例如:set_intersection、set_union。变更序列#include<algorithm>#include<vector>intmain(){std::vector<int>vec={3,1,4,1,5,9,2,6,5};//使用sort算法对向量进行排序std::sort(vec.begin(),vec.end());//使用reverse算法对向量进行反转std::reverse(vec.begin(),vec.end());//使用unique算法去除重复元素std::unique(vec.begin(),vec.end());//使用erase算法删除元素vec.erase(std::unique(vec.begin(),vec.end()),vec.end());return0;}查找#include<algorithm>#include<vector>#include<iostream>intmain(){std::vector<int>vec={1,2,3,4,5};//使用find算法查找元素3std::vector<int>::iteratorit=std::find(vec.begin(),vec.end(),3);if(it!=vec.end()){std::cout<<"元素3在向量中的位置:"<<std::distance(vec.begin(),it)<<std::endl;//输出:元素3在向量中的位置:2}else{std::cout<<"向量中不存在元素3"<<std::endl;}return0;}排序#include<algorithm>#include<vector>intmain(){std::vector<int>vec={3,1,4,1,5,9,2,6,5};//使用sort算法对向量进行排序std::sort(vec.begin(),vec.end());//输出排序后的向量for(inti:vec){std::cout<<i<<"";//输出:112345569}return0;}排列组合#include<algorithm>#include<vector>#include<iostream>intmain(){std::vector<int>vec={1,2,3};//使用next_permutation算法生成下一个排列do{for(inti:vec){std::cout<<i<<"";//输出:123,132,213,231,312,321}std::cout<<std::endl;}while(std::next_permutation(vec.begin(),vec.end()));return0;}数值计算#include<algorithm>#include<vector>#include<iostream>intmain(){std::vector<int>vec={1,2,3,4,5};//使用accumulate算法计算向量元素的总和intsum=std::accumulate(vec.begin(),vec.end(),0);std::cout<<"向量元素的总和:"<<sum<<std::endl;//输出:向量元素的总和:15return0;}集合操作#include<algorithm>#include<set>#include<iostream>intmain(){std::set<int>set1={1,2,3,4,5};std::set<int>set2={3,4,5,6,7};//使用set_intersection算法求两个集合的交集std::set<int>intersection;std::set_intersection(set1.begin(),set1.end(),set2.begin(),set2.end(),std::inserter(intersection,intersection.begin()));//输出交集std::cout<<"两个集合的交集:"<<std::endl;for(inti:intersection){std::cout<<i<<"";//输出:两个集合的交集:345}std::cout<<std::endl;return0;}函数对象#include<iostream>#include<functional>//定义一个函数对象,用于计算两个数的和classAdd{public:intoperator()(inta,intb){returna+b;}};intmain(){Addadd;intsum=add(5,3);std::cout<<"5+3="<<sum<<std::endl;//输出:5+3=8return0;}函数对象的应用#include<algorithm>#include<vector>#include<functional>//定义一个函数对象,用于将元素值乘以2classMultiplyByTwo{public:intoperator()(inta){returna*2;}};intmain(){std::vector<int>vec={1,2,3,4,5};//使用transform算法将向量元素值乘以2std::transform(vec.begin(),vec.end(),vec.begin(),MultiplyByTwo());//输出修改后的向量for(inti:vec){std::cout<<i<<"";//输出:246810}return0;}Lambda表达式#include<iostream>#include<functional>intmain(){//定义一个Lambda表达式,用于计算两个数的和autoadd=[](inta,intb){returna+b;};intsum=add(5,3);std::cout<<"5+3="<<sum<<std::endl;//输出:5+3=8return0;}使用函数对象实现自定义排序#include<algorithm>#include<vector>#include<iostream>//定义一个函数对象,用于根据元素的绝对值进行排序classAbsComparator{public:booloperator()(inta,intb){returnstd::abs(a)<std::abs(b);}};intmain(){std::vector<int>vec={3,-1,4,-1,5,-9,2,6,-5};//使用sort算法对向量进行排序,使用AbsComparator作为比较器std::sort(vec.begin(),vec.end(),AbsComparator());//输出排序后的向量for(inti:vec){std::cout<<i<<"";//输出:-1-12345-56-9}return0;}容器适配器堆栈适配器使用容器(如向量、列表、双端队列)实现堆栈的功能。队列适配器使用容器(如向量、列表、双端队列)实现队列的功能。优先队列适配器使用容器(如向量、列表、双端队列)实现优先队列的功能。堆栈适配器#include<stack>#include<vector>intmain(){//使用向量创建堆栈std::stack<int,std::vector<int>>stk;//压栈stk.push(1);stk.push(2);//弹栈stk.pop();//获取栈顶元素inttop=stk.top();return0;}队列适配器#include<queue>#include<list>intmain(){//使用链表创建队列std::queue<int,std::list<int>>que;//入队que.push(1);que.push(2);//出队que.pop();//获取队首元素intfront=que.front();return0;}优先队列适配器#include<queue>#include<vector>intmain(){//使用向量创建优先队列std::priority_queue<int,std::vector<int>,std::greater<int>>pq;//插入元素pq.push(1);pq.push(3);pq.push(2);//获取优先级最高的元素inttop=pq.top();return0;}STL的优点1可扩展性和灵活性STL提供了丰富的容器、算法和函数对象,可以满足各种编程需求,并且可以轻松扩展以满足未来需求。2代码复用和生产力STL的通用性使代码可以轻松复用,减少代码编写量,提高开发效率。3性能优化STL的算法和数据结构经过精心设计,优化了性能,提高了代码执行效率。可扩展性和灵活

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论