qluoj第一次讲课笔记(shawn zhou大佬)

第一次听大佬在线讲题,虽然讲的是一些基础,但是从这里就深深的感受到了自己和大佬的差距非常之大
如果想填补差距,那就只能一直不断的学习!
下面是我对这次讲课的基本整理(是我听讲的时候写的,感觉会有点用的吧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(35=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





猜你喜欢

转载自blog.csdn.net/weixin_43537190/article/details/84779437