第一次听大佬在线讲题,虽然讲的是一些基础,但是从这里就深深的感受到了自己和大佬的差距非常之大
如果想填补差距,那就只能一直不断的学习!
下面是我对这次讲课的基本整理(是我听讲的时候写的,感觉会有点用的吧233)
1.
(1 容器 多种多样的数据结构
(2 迭代器 用来遍历容器的工具
(3 算法 algorithm
----------------------------------------------------------------------------------------------------
2.
要想使用特定的容器,需要加上对应的头文件
example: 栈 #include<stack>
队列#include<queue>
stl堆->优先队列 在queue里
priority_queue优先队列:
stl 的容器可以自动调整大小 所以并不用定义大小
------stl栈 可以实现栈的所有基本功能:
假设现在有一个stack<int>s;
s.push(item); //将item压入栈顶
s.pop(); //删除栈顶的元素,但不会返回
s.top(); //返回栈顶的元素,但不会删除
s.size(); //返回栈中元素的个数
s.empty(); //检查栈是否为空,如果为空返回true,否则返回false
------stl队列 可以实现队列的所有基本功能:
queue<int>a;
q.push(item) //将item压入队列尾部
q.pop() //删除队首元素,但不返回
q.front() //返回队首元素,但不删除
q.back() //返回队尾元素,但不删除
q.size() //返回队列中元素的个数
q.empty() //检查队列是否为空,如果为空返回true,否则返回false
------stl优先队列 可以实现堆的所有基本功能
名字是优先队列,但是满足堆的性质。
插入和删除的复杂度o(logn)。比较优秀,可以代替手写堆
priority_queue<int>a;
q.push(item) //将item压入队列尾部
q.pop() //删除队首元素,但不返回
a.top() // queue里面为a.front();
q.back() //返回队尾元素,但不删除
q.size() //返回队列中元素的个数
q.empty() //检查队列是否为空,如果为空返回true,否则返回false
如果写priority_queue生成一个小根堆 数据从小到大 同下 自动排序好
如果要生成大根堆 :priority_queue<int,vector<int>,greater<int>>q; 此时是从大到小
(优先队列自动排序 即输入无序的东西以后要是输出的话自动排序)
每次进队以前对数据进行一次比对,然后将输入的数调整到合适的位置
-------向量和双端队列::
这里的向量和向量的定义不太一样
它的本质就是一个不定长的数组,有的地方也叫它动态数组。
需要#include<vector>
当你需要一个数组但是并不知道应该用多大(但是可能会很大)的时候 vector就可以派上用场了
vector<int>v;
v.chear();清除
v.push_back(i);压入元素(队尾)
v.size();取一下元素个数
v.pop_back();将最后的一个删除
vector还有一个insert的用法,可以在中间插入什么的= = !
双端队列 支出在两端进行插入和删除,但是普通队列只能一端
入队首:q.push_front();
删除队首:q.
集合 映射 对组(关联容器)
序列式容器各个元素之间有关系(物理地址连接)
但是关联容器的内部构造和上面不一样
(使用迭代器遍历)
------集合:
集合是一个关联容器,定义就是一个集合
元素是唯一的
时间复杂度为o(logn)(好像挺快的吧我也不是很清楚23333
由于删除和插入都是按照写好的排序规则插入,所以不能指定位置插入
set不允许直接存取元素 用迭代器 去重 排序;
#include<set>
使用insert()向set里面插入一个或者多个元素,参数为1的时候是插入一个人值
当参数为2的时候传入俩指针
传入数据段的起始地址
begin() //返回set容器的第一个元素
end() //返回set容器的最后一个元素
clear() //删除set容器中的所有的元素
empty() //判断set容器是否为空
max_size() //返回set容器可能包含的元素最大个数
size() //返回当前set容器中的元素个数
rbegin //返回的值和end()相同
rend() //返回的值和rbegin()相同
这里有一段代码 实现了set的基本操作
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
cout<<"set 的 size 值为 :"<<s.size()<<endl;
cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;
s.clear();
if(s.empty())
{
cout<<"set 为空 !!!"<<endl;
}
cout<<"set 的 size 值为 :"<<s.size()<<endl;
cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
return 0;
}
//不知道为啥这个maxn_size()很奇怪,
------映射
映射和集合类似,内部实现基本相同,提供了映射功能,可以做字典 比如字符下标或者字符串下标
map用的比较多啦
map基于一种键连接形成,一个键对应一个值,不能重复
可以用键来访问值
使用的时候需要#include<map>a;
由于定义需要定义键和值,所以基本为两个
map<char,int>ma;
向map中插入元素可以用set类似的insert();
方便一些:ma['a']=1;
遍历map也需要用到迭代器,但是下标有序的时候,直接遍历也可以的
map比较方便啦
应用!!!:建立转换关系
------对组
可以理解为由俩变量的结构体
第一个变量用.first 第二个.second
需要#include<utility>
pair<int,int>a;
------字符串
有点类似于vector;
#include<string>
string s'
与cin相性极好,读到空格结束cin>>s;
读到行末 getline(cin,s);
string 强在哪里?
有一个方法叫substr(起始位置 ,包括起始位置在内的向后选取长度)
举个例子 sring s=“23333333”
s.substr(3,5) =“33333”;
此外 string 可以直接相加
支持直接判断相等和大小
s.length()<==> s.size()返回串的长度
------------------------------------------------------------------------------------------------------------
-----迭代器初步
简单理解为已终结楼或者一种对象
行为上像迭代器的东西都可以叫做迭代器,实际上每一种容器都有自己的迭代器
set只能用迭代器来遍历
栈,队列,堆都是运算受限的数据结构,用不到迭代器
对于绝大多数容器来说
.begin()返回起始数值 a.end()返回最终的
for(vector<int>::iterator it=v.begin();it!=v.end;it++)
cout<<*it;//遍历vector
map的遍历:
for(map<char,int>::iterator it=ma.begin; it!=ma.end();it++)
cout<<it->first>>" ">>it->second>>endl;
------------------------------------------------------------------------------------------------------------
stl中的算法
------排序和乱序
排序算法 类似::快速排序 sort(起始位置迭代器,终止位置迭代器)
类似::归并排序stable_sort(起始位置迭代器,终止位置迭代器)
1.省事 排序可以任意类型!
2.省事
3.自定义排序
sort(a,a+10,greater<int>());
另一种是重载运算符
bool operator<(const str&rhs)>const {
return x<rhs.x;
}
lhs left hand side 左操作数
rhs right hand side 右操作数
bool operator<(const str &rhs)const> {
return mat>rhs.mat||(mat==rhs.mat)rhs.eng>eng;
}
乱序。。。 传入的时候和sort一样 不过功能和sort相反
random_shuffle(a,a+10);//全部打乱!!!
-------排列和去重
next_permutation 可以对一个区间的数进行排列并且生成下一个排列
while(next_permutation(a,a+4));
unique去重函数
直到完全相反的时候返回一个flase 直接退出循环 (可以生成全排列)
a[8]={2,2,3,3,4.4.5,5};
int *end=unique(a,a+8)
for(int *i = a; i != end; i++)
cout << *i << " ";
-------其他
swap 交换两个任意相同类型的值
min 和 max 返回两者最小/最大值
-----------------------------------------------------------------------------------------------------------
太!慢!了!
stl::sometimes tle 2333