STL标准模板库 standard template library
=========================================
1.概念
STL是C++提供给我们开发程序的一个类库,它里面提供大量的模板类,算法给我们使用
STL库的核心内容
容器
迭代器
常用算法
函数符(函数对象)
STL中常用的容器
=========================================
1.作用
容器是用来存放数据的,容器的本质是模板类
2.分别介绍常用的容器
(1)向量容器 vector
本质是个动态数组,大小是可以自动调节,根据数据的个数会自动调节容器大小
头文件:#include <vector>
常用方法:
(1)赋值
void assign (InputIterator first, InputIterator last);
范围从[first,last) 包含first,不包含last
注意:STL模板库中所有的函数,只要涉及到迭代器表示范围的,全部都是包含first,不包含last
(2)安放数据
emplace(迭代器,某个数据)
把数据存放到迭代器的前面,不会覆盖到容器中原本的数据
(2)set容器(集合)
会自动排序(升序),你输入的无序,但是保存到set中是升序的
不能存放重复数据
头文件:#include <set>
常用方法:
(1)清空集合
clear()
(2)统计元素
count(某个元素值) //返回这个元素在set中出现的次数
(3)安放数据
pair<iterator,bool> emplace(某个数据) //自动升序排序,把这个数据安放在合适的位置
返回值:pair<iterator,bool>
iterator --》迭代器,指向安放的数据位置
bool --》安放成功true,安放失败false
如何获取返回值涉及到迭代器/bool类型
pair<iterator,bool> mypair=emplace(105);
mypair.first --》对应迭代器
mypair.second --》对应bool
(4)判断set是否为空
empty()
(5)删除数据
erase(迭代器)
erase(某个元素值)
erase(first,last) //删除[first,last)范围数据
set的迭代器不可以做加法,但是可以自增
(6)查找
find(某个元素) //返回迭代器,指向你找到的元素,没有找到,返回end()
(3)list容器
头文件:#include <list>
常用方法:
(1)带条件的删除
remove_if(函数符/函数对象)
(2)排序
sort(函数符/函数对象)
(4)map容器
存放键值对,用来描述生活中一对一对应关系
比如:学生姓名 学号
张三 1
张三 3
张三 4
李四 2
星期 英文
星期一 monday
星期二 tuesday
星期三 wendsday
左边是键,右边的是值
同一个键不可以对应多个不同的值
同一个值可以对应多个不同的键
(5)stack栈容器
(6)queue队列容器
3.auto关键字和新式for循环
auto关键字:自动匹配类型
新式for循环:
for(auto &x:容器对象)
{
引用x可以自动遍历容器对象里面的数据;
}
4.迭代器
类似于指针,专门用来遍历,访问各种容器中的数据
4.1 迭代器对应的函数
begin() --》返回起始位置(容器中第一个元素)的迭代器
end() --》返回末尾位置后面一个位置(容器最后一个元素的后面位置)
4.2 迭代器分为四种类型
读写迭代器:通过这个迭代器既可以访问容器中的元素,也可以修改容器中的元素
begin()和end()配合使用,返回的就是读写迭代器
只读迭代器
cbegin()和cend()配合使用,只能访问数据,不能修改数据
逆迭代器:倒着访问数据,从尾到头访问/修改数据
rbegin()和rend()配合使用
只读逆迭代器:倒着访问数据,从尾到头访问数据,不能修改数据
crbegin()和crend()配合使用
函数符/函数对象
=========================================
1.概念
C++中的函数符总共有三种:分别是谓词函数,类重载了圆括号(类对象作为实参),Lambda表达式
2.谓词函数
分为两种:一元谓词函数,二元谓词函数
一元谓词函数:函数返回值是bool类型,形参只有一个--》C++把这种类型的函数称之为一元谓词函数
二元谓词函数:函数返回值是bool类型,形参有两个--》C++把这种类型的函数称之为二元谓词函数
3.类重载了圆括号
class 类名
{
public:
bool operator()(形参)
{
}
};
4.Lambda表达式(匿名函数)
bool fun(int &x)
{
return (x%2==1);
}
转换成Lambda表达式:
把谓词函数的返回值类型和名字全部去掉,用[]代替,其余部分照抄
[](int &x){return (x%2==1);} --》Lambda表达式
5.求一个整数的二进制
练习
=========================================
1.熟悉vector剩余的方法,写代码把这些方法都用一遍
2.使用vector存放整数,要求用户从键盘输入8个整数(随机输入)
要求:
把8个整数中奇数升序排列,偶数降序排列,并且排序以后的奇数存放到排序以后的偶数的前面
454 85 4165 855 89 355 8 63
执行完毕: 63 85 89 355 855 4165 454 8
3.同一个键--》对应多个不同的值
同一个值--》对应多个不同的键
作业
=========================================
1. 从键盘输入两个字符串,判断第一个字符串能不能由第二个字符串里面的字符构成。如果可以构成,返回 true ;否则返回 false
比如:
helloworld
hel
思路分析:
第一步:剔除第一个字符串中重复的字符
helloworld --》helowrd
第二步:剔除第二个字符串中重复的字符
hel --》hel
第三步:再去判断剔除重复字符以后字符能否构成第一个字符串
2. 给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符:
'A’ : Absent,缺勤
‘L’ : Late,迟到
‘P’ : Present,到场
如果一个学生的出勤记录中不超过一个’A’(缺勤)并且不超过两个连续的’L’(迟到),那么这个学生这门课就及格。
你需要根据这个学生的出勤记录判断他是否会及格
比如: 张三的出勤记录: ALLLPPP //不及格
ALPPPPA //不及格
李四的出勤记录: ALPPPLPPPPLPP //及格
第一步:遍历字符串,统计A的次数
第二步:判断是否连续迟到了两次以上(不包括两次)
string temp="LLL"; substr(截取字符串)