acwing系列好久不更哈哈哈,不好意思友友们,因为acwing系列算法基础课我打算是通过解释代码,和做代码运行动画俩种方式来给大家具体讲解疑惑,但是我看了看第一次发的二分模板不是太理想,第一次写不好意思,嘿嘿,所以后面加大了对自己的要求,我也是想一下子更新一个模块这样大家学起来也方便,今天先给大家更新一下c++STL的知识作为后面学习最后一次补基础,这个在算法基础课的第二章最后一节课有视频讲解,我把代码和笔记送给大家,需要自取。
C++ vector
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> a(10,3);//定义一个长度为10初始值为3的vector数组
for(auto i:a)cout<<i<<endl;//输出方式
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> a;
a.size();//返回元素个数所以stl都有
a.empty();//返回是否为空返回值是ture flase
}
//三种vector输出方式
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> a;
for(int i=0;i<10;i++)a.push_back(i);
for(int i=0;i<a.size();i++)cout<<a[i]<<' ';
cout<<endl;
for(vector<int>::iterator i=a.begin();i!=a.end();i++)cout<<*i<<' ';
cout<<endl;
for(auto x:a)cout<<x<<' ';
cout<<endl;
return 0;
}
//pair基本用法
#include<iostream>
#include<vector>
using namespace std;
int main()
{
pair<int,string>p;//pair可以定义任意二元组里面的两个类型也可以随意取
p.first//取第一个变量
p.seconf
p=make_pair(10,"yxc");//两种赋值的办法
p={20,"ycx"};
pair<int,pair<int,int>>p;//定义三个属性变量
}
vector, 变长数组,倍增的思想
size() 返回元素个数
empty() 返回是否为空
clear() 清空
front()//返回vector第一个数
back//返回vector最后一个数
push_back()//向vector最后插入一个数
/pop_back()//把vector最后一个数删掉
begin()//vctor第0个数
/end()//vector的最后一个数后面的数
[]
支持比较运算,按字典序
//系统为某一个程序分配空间时所需时间与空间大小无关与申请次数有关,所以思路是变长数组减少申请次数
pair<int, int>
first, 第一个元素
second, 第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
string,字符串
size()/length() 返回字符串长度
empty()
clear()
substr(起始下标,(子串长度)) 返回子串
c_str() 返回字符串所在字符数组的起始地址
queue, 队列
size()
empty()
push() 向队尾插入一个元素
front() 返回队头元素
back() 返回队尾元素
pop() 弹出队头元素
q=queue<int>();清空队列的方式就是像这样新建一个队列
priority_queue, 优先队列,默认是大根堆
size()
empty()
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素
定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;//或者插入(-x)
stack, 栈
size()
empty()
push() 向栈顶插入一个元素
top() 返回栈顶元素
pop() 弹出栈顶元素
deque, 双端队列
size()
empty()
clear()
front()/back()
push_back()/pop_back()
push_front()/pop_front()
begin()/end()
[]//支持随机寻址
set//不能有重复元素如果插入重复元素是忽略操作
map
multiset//可以插入重复元素
multimap, 基于平衡二叉树(红黑树),动态维护有序序列
size()
empty()
clear()
begin()/end()
++, -- 返回前驱和后继,时间复杂度 O(logn)
set/multiset
insert() 插入一个数
find() 查找一个数
count() 返回某一个数的个数
erase()
(1) 输入是一个数x,删除所有x O(k + logn)
(2) 输入一个迭代器,删除这个迭代器
lower_bound()/upper_bound()
lower_bound(x) 返回大于等于x的最小的数的迭代器
upper_bound(x) 返回大于x的最小的数的迭代器
map/multimap
insert() 插入的数是一个pair
erase() 输入的参数是pair或者迭代器
find()
[] 注意multimap不支持此操作。 时间复杂度是 O(logn)
lower_bound()/upper_bound()
unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表
和上面类似,增删改查的时间复杂度是 O(1)
不支持 lower_bound()/upper_bound(), 迭代器的++,--
bitset, 圧位
bitset<10000> s;
~, &, |, ^
>>, <<
==, !=
[]
count() 返回有多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置成1
set(k, v) 将第k位变成v
reset() 把所有位变成0
flip() 等价于~
flip(k) 把第k位取反
这里部分是加了我自己的理解,但是还是建议大家边学边查毕竟不是所有的知识都需要,记一些常用的,后面遇到查就行。