日常笔记6C++标准模板库(STL)用法介绍实例
一、vector常见用法详解
- vector翻译为向量,但是这里翻译成变长数组的叫法更好理解。
- 如果typename是一个STL容器,定义的时候要记得在>>符号之间加上空格,因为在C++11之前标准的编译器会把他当成位移操作。vector<vector > name;
- vector Arrayname[arrySize]和vector<vector > name不一样,其中定义为数组的即第一个中每个都是一个vector容器,一维长度已经固定为arrySize的大小。
- vector元素访问有两种方式,一种是通过下标,还有一种是通过迭代器,通过下标访问和普通数组是一样的操作,重点是通过迭代器访问,vector::iterator it;可以把迭代器理解成像指针一样的东西,通过*it可以访问vector里面的内容。在C++11中特别是在for循环中可以写成auto it
- v[i]和*(v.begin()+i)是等价的
- 左闭右开记住这个思想
- 迭代器中还实现了两种自加操作:++it和it++(自减同理)迭代器支持it < v.end()因此循环条件一般使用it != v.end()
- 在常用STL容器中,只有vector和string中才允许使用v.begin()+i这种迭代器上加数字的写法。
- 迭代器:vector<typename>::iterator it;
常用函数:
- push_back()就是在vector后添加一个元素,时间复杂度为O(1)
- pop_back()就是在vector末尾删除一个元素,时间复杂度为O(1)
- size()用来获得vector中元素的个数,时间复杂度为O(1),size返回的是unsigned类型,这一点对所有的STL都是一样的。
- clear()用来清空vector中所有的元素
- insert(it, x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度为O(N)
- erase()有两种用法删除单个元素,删除一个区间内的所有元素,时间复杂度均为O(N),erase(it)删除迭代器为it位置处的元素;erase(first, last)例如erase(v.begin(), v.begin()+i),左闭右开。
常见用法:
- 存储数据本身可以作为数组使用
- 用邻接表存储图
二、set的常见用法详解
- set翻译为集合,是一个内部自动有序且不含重复元素的容器。
- set容器的元素只能通过迭代器(iterator)访问。
- set内的元素自动递增排序,且自动去除了重复元素。
- 迭代器:set::iterator it;
常见函数用法:
- insert(x)可以将x插入set容器中,并自动递增排序和去重,时间复杂度O(logN)。
- find(value)返回set中对应值为value的迭代器。时间复杂度同上。
- erase()有两种用法,删除单个元素;删除一个区间的所有元素。删除单个元素有两种方法:(1)st.erase(it),it为所需删除元素的迭代器,时间复杂度为1,结合find()函数使用(2)st.erase(value),value为所需删除元素的值,时间复杂度为O(logN);然后是删除区间元素st.erase(first, last)记住这里都是迭代器。
- size()用来获得set内元素的个数,时间复杂度为1
- clear()用来清空set中的所有元素,时间复杂度为O(N)。
常见用途:
- 主要作用是存储自动去重和升序。
- 如果需要处理不唯一的则需使用multiset,C++11中还加了unorder_set,以散列代替set内部的红黑树,可以实现只去重不排序的需求。
三、string的常见用法详解
- 在C语言中,一般是使用字符串数组来表示字符串的即char str[],但是C++直接引入string数据类型。
- string str;
- string可以如同字符串数组一样通过下标来访问;也可以通过迭代器来访问。
- 如果要读入或输出整个字符串只能够使用cin或cout,如果强行使用printf输出,可以使用c_str()函数将string强制转化为字符串数组,解决这个问题,printf("%s", str.c_str());
- string迭代器不像其他容器那样需要参数,string::iterator it;
- 同vector一样可以进行数字操作迭代器
常见函数:
- 可以直接进行拼接操作 str += str2;
- compare operator ,可以直接进行比较,是按照字典序来的
- length()/size(), length()返回string的长度,时间复杂度为1
- insert()有多种方法,时间复杂度为O(n),(1)insert(pos, string),pos是下标号,string是要插入的str,(2)insert(it, it2, it3),it是原字符要插入的位置,是迭代器,it2,it3是为待插入字符串的首尾迭代器。
- erase(),有两种用法,删除单个元素、删除一个区间内的所有元素,时间复杂度均为O(N),str.erase(it),it为要删除的迭代器,str.erase(first, last),区间迭代器。str.erase(pos, length),删除位置开始处,length接下来需要删除的长度。
- clear(),清空所有元素,时间复杂度为1.
- substr()提取字符串中子串, substr(pos, len)pos为位置,len为长度。
- string::npos是一个常数,其本身值为-1,可以作为find函数失配的返回值。
- find()返回出现的位置,str.find(str2), str.find(str2, pos),pos是指定开始查找位置。
- replace(), str.replace(pos, len, str2),把str从pos号位置开始,长度为len的子串替换为str2.
四、map的常见用法详解
- map翻译为映射,也是常用的STL容器。因为map可以将任何基本类型映射到任何基本类型。
- map<typename1, typename2> mp;如果是字符串映射到整数,必须使用string而不能使用char数组。
- 访问方式,使用下标访问,也就是键值。也可以使用迭代器访问,和其他迭代器访问方式一样。
- map可以使用it->first来访问键值,使用it->second来访问值。
- map会以键值从小到大的顺序自动排序,因为map内部也是使用红黑树实现的。
常见函数:
- find(key)返回键值为key的映射的迭代器
- erase(),也有两种用法,单个和区间,mp.erase(it/key)注意是迭代器或是键值即可,区间都是迭代器。
- size(),用来返回map中的对数。
- clear(),清空所有元素。
常见用途
- 需要建立字符与整数之间的联系
- 判断大整数或其他类型是否存在,当bool类型使用
- 字符串和字符串之间的映射也有可能会遇到。
五、queue的常见用法详解
- queue翻译为队列,在STL中主要实现了一个先进先出的的容器
- queue内元素访问,因为队列本身是一种先进先出的数据结构,因此只能通过front()来访问队首元素,通过back()来访问队尾元素,通过push()来将元素压入队列。
常见函数:
- push(x), 将元素x压入队列,时间复杂度为1.
- front()、back()分别用于访问队首和队尾元素。
- pop(),让队首元素出列。
- empty()检查队列是否为空,如果为空返回true,否则返回false
- size()返回queue内元素的个数
主要用途:
- 当实现广度优先搜索时,可以不用自己动手实现一个队列。
- 在使用front()back()时,必须先使用empty()判断队列是否为空,否则会出现错误。
六、priority_queue的常见用法详解
- priority_queue又称优先队列,由名字可知队首元素是当前队列中优先级最高的那一个,底层使用堆来进行实现。可以在任何时候使用push()加入元素,会自动调整使得队首优先级最高。
- 优先队列元素访问,和队列不一样,没有front()和back()函数,只能通过top()函数来访问队首元素。
常见函数:
- push()
- top()
- pop()
- empty()
- size()
priority_queue内元素优先级设置
- 基本数据类型优先级设置:
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;//记得最后这两个>>是有空格的,以上两种方法等效对于基本数据类型而言,如果想换数据类型,只需把对应位置的换掉即可,这个是默认优先级数字越大越高,如果想要换成数字低优先级高,可以把less<int> 换成greater<int>.
- 结构体的优先级设置,相对而言更为重要
struct fruit{
string name;
int price;
}
//如果希望价格高的优先级高,就需要重载小于号<,如下:
struct fruit{
string name;
int price;
friend bool operator < (fruit f1, fruit f2){
return f1.price < f2.price;//注意这里是小于号<,跟cmp里面的符号设置相反。原因在于优先队列默认就是把优先级高的放在队首,记住和cmp中相反即可。
}
}
//接下来就可以进行设置fruit类型的队列了,其内部就是价格高的为优先级高,如果想要价格低的优先级高,只需把上面return中的<号换成>号
priority_queue<fruit> q;
//也可将结构体中的部分写在外面,如下:
struct cmp{
bool operator () (fruit f1, fruit f2){
return f1.price < f2.price;
}
}
//上面注意我们把friend去掉了,同时把<号改成了()
//使用之前第二种方式来定义:
priority_queue<fruit, vector<fruit>, cmp> q;//把之前的less<>换成了cmp
//最后指出如果结果体或数据较大,建议使用引用来提高效率,在比较类参数上加上const和&
friend bool operator < (const fruit &f1, const fruit &f2){
return f1.price < f2.price;//注意这里是小于号<,跟cmp里面的符号设置相反。原因在于优先队列默认就是把优先级高的放在队首,记住和cmp中相反即可。
}
常见用途
- 可以用于贪心算法,也可以解决Dijkstra算法进行优化
- 同样在使用前需要用empty()进行判断
七、stack的常见用法详解
- stack翻译为栈,是STL中实现后进先出的容器。
- 定义同其他容器一样
- 内部元素访问,只能通过top()来访问栈顶元素。
常见函数
- push()
- top()
- pop()
- empty()
- size()
常见用途:
- 一般来模拟实现一些递归,防止程序对栈内存限制导致程序运行出错。
八、pair的常见用法详解
- pair是一个很实用的东西,当想把两个元素绑在一起作为一个合成元素,又不想定义结构体时,pair可以很合适的作为一个替代品。
- pair应添加头文件<utility>
- pair定义:
pair<typename1, typename2> name;
//定义时初始化
pair<string, int> p("haha", 5);
//如果想定义临时pair,下面两种方法都可以
pair<string, int>("haha", 5);
make_pair("haha", 5);
- 元素访问,如同结构体一样即可p.first,p.second
- 比较操作数,可以直接进行比较,先用first进行比较,如果first相等,那么再使用second进行比较。
- 常见用途:作为map的键值对来进行插入如下:
map<string, int> mp;
mp.insert(make_pair("haha", 5));
九、algorithm头文件下常见函数
- max(x, y) min(x, y) abs(x) abs(x)中的x必须是整数,如果是浮点数请使用math头文件下的fabs(x)
- swap(x,y),用于交换想x,y的值
- reverse(it, it2)可以将数组指针在左闭右开之间的元素或容器迭代器范围内的元素进行反转。
- next_permutation(a, a+3),全排序列,使用do...while()
- fill(),可以把数组或容器中的某一段区间赋值为一个相同的元素,和memset中不同,这里的数字是可以为类型范围类对应的所有值。fill(a, a+5, 233);
- sort(),排序函数
- lower_bound()和upper_bound()详解见这里:https://www.cnblogs.com/tsruixi/p/11858226.html
日常笔记6C++标准模板库(STL)用法介绍实例的更多相关文章
- C++_标准模板库STL概念介绍1-建立感性认知
标准模板库的英文缩写是STL,即Standard Template Library. STL里面有什么呢? 它提供了一组表示容器.迭代器.函数对象和算法的模板. 容器是一个与数组类似的单元,可以存储若 ...
- C++_标准模板库STL概念介绍5-其他库与总结
C++还提供了其他一些类库,这些类库更加专用. 例如,头文件complex为复数提供了类模板complex,包含用于float.long和long double的具体化. 这个类提供了标准的复数运算以 ...
- C++_标准模板库STL概念介绍4-算法
STL包含很多处理容器的非成员函数: sort() copy() find() random_shuffle() set_union() set_intersection() set_differen ...
- C++_标准模板库STL概念介绍3-函数对象
函数对象也叫做函数符(functor). 函数符是可以以函数方式和( )结合使用的任意对象. 包括函数名,指向函数的指针,重载了()运算符的类对象. 可以这样定义一个类: class Linear { ...
- C++_标准模板库STL概念介绍2-泛型编程
有了之前使用STL的经验后,接下来讨论泛型编程及其底层的理念: 首先我们知道STL只是泛型编程的一种: 而面向对象的编程方式关注的是编程的数据方面: 而泛型编程关注的是算法: 但是,他们之间的一个重要 ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
随机推荐
- 使用vmware workstation安装centos 7操作系统
安装步骤 1.点击创建虚拟机,进入新建虚拟机向导,选择自定义,典型:相当于去电脑 旗舰店里店员推荐的是一样,推荐的比一定好,自定义:是手动操作的,没有linux基础最好选择自定义.点击下一步. 2.虚 ...
- vue表格合并行的一个实例
一.element控件实现 在平常的应用中,需要用到合并单元格的操作,在Excel中,这种操作很好实现,但在实际项目中,常常需要借助element控件来实现. 下面是element中的一个实例 ...
- JavaScript中如何判断数组类型
前言 JavaScript中关于数组的判定问题,一直都是一个必须要掌握的点,那么,运用知识,如何判断一个类型是数组,就需要有对JavaScript使用有着深入的了解. 判断方法 一.Array.isA ...
- Flink on YARN时,如何确定TaskManager数
转自: https://www.jianshu.com/p/5b670d524fa5 答案写在最前面:Job的最大并行度除以每个TaskManager分配的任务槽数. 问题 在Flink 1.5 Re ...
- SpringBoot系列之配置文件加载位置
SpringBoot系列之配置文件加载位置 SpringBoot启动会自动扫描如下位置的application.properties或者application.yml文件作为Springboot的默认 ...
- 14-认识DjangoRESTframework
了解DjangoRESTframework 现在流行的前后端分离Web应用模式,然而在开发Web应用中,有两种应用模式:1.前后端不分离 2.前后端分离. 1.前后端不分离 在前后端不分离中,前端看见 ...
- 基于python的selenium常用操作方法(1)
1 selenium定位方法 Selenium提供了8种定位方式. · id · name · class name · tag ...
- VMWare 虚拟机启动报“内部错误”的解决办法
情况 启动虚拟机的时候,启动不起来,弹出对话框,内部错误. 原因 Vmware 的 server 服务未开启. 解决办法 将以上服务都启动起来
- C# convert between Image and Base64string
static void ImageMSDemo(string picPath) { byte[] imageArray = System.IO.File.ReadAllBytes(picPath); ...
- JS基础语法---阶段复习+作业练习+接下来知识点heads up
调试:调试代码---高级程序员都是从调试开始的 调试: 写代码---打开浏览器--F12(开发人员工具)--->Sources---双击文件,在某一行代码前面点击一下(出现的东西就是断点) 一元 ...