梁朝伟做汤唯视频网站,运城网站推广,沈阳网站建设与开发,个人注册公司代理对STL进行总结#xff0c;STL是standard template library的简写#xff0c;是C中的一个标准模板库#xff0c;用于实现常用的数据结构和算法#xff0c;它是C程序员经常使用的一个工具箱。STL 的主要目的是提高开发效率和代码质量#xff0c;使得程序员可以更加便捷地完成…对STL进行总结STL是standard template library的简写是C中的一个标准模板库用于实现常用的数据结构和算法它是C程序员经常使用的一个工具箱。STL 的主要目的是提高开发效率和代码质量使得程序员可以更加便捷地完成常见的操作。里面包括算法algorithm、容器container、仿函数functors、迭代器iterator等这篇文章先说容器
容器 容器之所以叫容器可以抽象理解为我们装东西的容器比如装水的盒子只不过C里的容器是用于装数据STL这个库里面它提供了很多种容器类型用于存储数据。主要包括vector动态数组、set集合、map(映射)、stack栈、queue队列、priority—queue优先队列、string字符串、pair(二元组) vector可以动态调整大小的数组支持快速的随机访问和迭代器访问并且支持在尾部添加或删除元素。set有序集合其中每个元素都是唯一的支持快速的查找和插入操作。unordered_set无序集合其中每个元素都是唯一的支持快速的查找和插入操作但元素的顺序是未定义的。map有序映射其中每个元素都有一个唯一的键值对支持快速的查找和插入操作。unordered_map无序映射其中每个元素都有一个唯一的键值对支持快速的查找和插入操作但元素的顺序是未定义的。deque双端队列支持快速的随机访问和迭代器访问并且支持在头部和尾部添加或删除元素。list双向链表只支持迭代器访问并且支持在任意位置添加或删除元素。 vector 它的和数组差不多区别就是他的长度是动态可变的存储在堆中一般可以替换普通数组 #includevector vector类型 数组名(长度[初值]) //构造 vectorint arr; //构造int数组 vectorint arr(100); //构造初始长度100的数组 vectorint arr(1001); //构造初始长度100的数组初值为1 vectorvectorint mat(100,vectorint()); //构造初始100行不指定列数的二维数组 vectorvectorint mat(100,vectorint(666-1)); //构造初始100行初始列600的二维数组初始值-1 vectorvectorvetcorint mat1(100, vectorvectorint(6vectorint(4))); //构造初始100行初始列6的三维维数组 尾接尾删 push_back(元素)在vector尾接一个元素数组长1pop_back()删除vector尾部的一个元素数组长度-1 改变长度 数组名.resize() arr.resize(100); //将vector的长度改为100 set
set 里的元素只出现一次且元素没有顺序 因此适用于对元素去重维护顺序等 #includeset set类型比较器 集合名 //构造 setint st; //存储int集合从小到大 set int,greaterint st1; //存储int集合从大到小 遍历
使用迭代器进行遍历
#includebits/stdc.h
using namespace std;int main()
{setint st; //构造一个集合st.insert(1); //插入1st.insert(2); //插入2st.erase(1); //删除1st.find(2); //找到1就返回1//遍历for (setint::iterator it st.begin(); it !st.end(); it){cout *it endl;}return 0;
}
map 有序键值对结构底层原理是黑红树。一个键只可以在映射中出现一次且没有顺序
健类型要存储健的数据类型
值类型要存储的数据类型
比较器键要比较大小使用的比较器默认为less数据类型可自定 #includemap map健类型值类型比较器 名字 //构造map mapint,int mp; // int—int的映射从小到大 mapint,int,greaterint mp1; // int—int的映射从大到小 mp[1] 2 //增加 mp.erase(1); // 删除1这个键 mp[1] 3; // 改 cout mp[1] endl; //查 mp.count(元素) //检查元素是否存在 for(mapint,int::iterator it mp.begin(); it ! mp.end(); it)
{ cout it - first i- second endl;
}//上述用迭代器的方法太长 不好读 一般使用下面基于范围循环的方法for(auto m:mp) //是引用 m 是自定义的 mp是要便利的map的名字
{coutm.first m.second endl;
}
stack
通过二次封装双端队列queue实现先进后出的栈数据结构 #includestack stack数据类型 名字 stackint stk; //构造一个栈 stk.push(1); //进栈 stk.pop(); //出栈 stk.top(); //取顶栈 queue 先进先出 #includequeue queue数据类型 队名 //构造队列 queueint que; //构造一个叫que的队列 que.push(元素) //进队 que.pop() //出队 que.front() ; //取队首 que.back(); //取队尾 deque
首尾都可插入和删除的队列为双端队列
双端队列排序一般不用
priority_queue
优先队列是在正常队列的基础上加了优先级保证每次的队首元素都是优先级最大的。
可以实现每次从优先队列中取出的元素都是队列中优先级最大的一个 #includequeue priority_queue数据类型 名字 //构造一个优先队列 priority_queueint q1; // 默认大根堆, 即每次取出的元素是队列中的最大值 priority_queueint, vectorint, lessint q2; // 大根堆, 每次取出的元素是队列中的最大值同第一行 priority_queueint, vectorint, greaterint q3; // 小根堆, 每次取出的元素是队列中的最小值 string
存储字符串 string 长度初值 //构造函数 string s1; //构造字符串为空 string s2 abcde; //构造字符串 并赋值abcd string s3(10,6); //通过构造函数构造为66666666666 cin s1; //输入字符串 cout s1; //输出字符串 s1fgj; //尾接字符串 pair
存储二元组两个元素的一个组合 #includeutiity pair类型类型 pr //构造一个二元组 pariint, int p1; //存储int型的元组 pairint, long long p2; pairint, char pr3{1,a}; //赋值 第一个元素是1第2个元素是a int a pr.first; //取第一个值 int b pr.second; //取第二个值