DAY1 STL基础
容器
string vector queue stack set map list
String 字符串
迭代器:string::iterator it=s1.begin()
函数
- clear()
- length()
- push_back() //在最后插入
- append() // append(n,’ ') 在最后插入n个‘ ’ append(str2,n,m) 在后面插入str2 中第n个开始插入m个字符 n,m可以省略
- find() // find(x,pos) 从第pos个位置开始找x pos可省略
- erase()
//erase(pos,n) 删除从pos开始的n个字符 n省略则只去掉一个 //erase(s.begin()+1,s.end()-1) 从begin+1删到end-1 这里两个需要都是迭代器
Vector 向量
动态数组,内存连续
可以随机访问
构造函数:
- vector< int > v1;
- vector< string > v2(“1234”);
- vecotr< int > v3(5,2); // 22222
- vector< int > v4(v3);
常用函数:
- push_back()
- pop_back()
- front()
- back()
- insert() // insert(iterator,value)
- erase()
- size()
Queue 队列
先进先出(FIFO)
构造函数queuequ;
常用函数:
- push()
- pop()
- front()
- back()
- size()
- empty() // 清空
Priority_queue 优先队列
他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队
即值越大的在越上边
priority_queue <int,vector<int>,greater<int> > 升序队列
priority_queue <int,vector<int>,less<int> > 降序队列
Deque 双端队列
双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
http://www.cplusplus.com/reference/deque/deque/
Stack 堆栈
先进后出(FILO)
构造函数stackst;
常用函数:
- push()
- pop()
- top()
- size()
- empty()
Set 集合
元素有序排列、不重复
查询、插入、删除O(logn)
构造函数:set<int> se;
常用函数:
-
insert()
-
erase()
-
find()
-
size()
-
clear()
-
count() // count(value) 数value有几个 (只有0和1)
-
lower_bound(x):大于等于x的第一个元素位置,不存在返回end() 返回迭代器
要知道第几个需要lower_bound(v.begin(), v.end(), 2) - v.begin() -
upper_bound(x):大于x的第一个元素位置,不存在返回end()
Multiset
C++语言中,multiset是<set>库中一个非常有用的类型
它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成
而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。
构造函数:multiset<int> h;
Map 字典
key-value键值对,按key有序排列
插入、删除O(logn)
可以通过[ ]访问
构造函数:map<int,int>;
常用函数:
- erase()
- find()
- size()
- clear()
- count()
- lower_bound()
- upper_bound()
Unordered_map
用法与 Map 相差不大
优点: 因为内部实现了哈希表,因此其查找速度非常的快
缺点: 哈希表的建立比较耗费时间
适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map
List 双向链表
内存不连续
不支持随机访问
插入、删除O(1)
构造函数:list<int> li;
常用函数:
- push_back()
- push_front()
- pop_back()
- pop_front()
- insert()
- erase()
函数
sort reverse next_permutation
Sort 排序
vector<int>ve({4,3,5,2,6,1});
sort(ve.begin(),ve.end()); // ve全排序
sort(ve.begin(),ve.end(),greater<int>()); // 倒叙排序
bool cmp(int a,int b)
{
if(a%2==b%2) return a<b;
return a%2>b%2;
}
sort(ve.begin(),ve.end(),cmp); // 奇偶分离
Reverse 翻转
翻转数组、容器
- int x[1005];
- reverse(x+1,x+1+n);
- vector<int>ve;
- reverse(ve.begin(),ve.end());
Next_permutation 更大的字典序
求全排列中字典序更大的一个序列,不存在更大时返回false
int x[105];
int n=5;
for(int i=1;i<=n;i++)x[i]=i;
while(pre_permutation(x+1,x+1+n)); //找到最小的一组
do{
for(int i=1;i<=n;i++)printf("%d ",x[i]);
puts("");
}while(next_permutation(x+1,x+1+n));
基础TIPS
-
绝大部分情况下用C++(效率高、code速度快),少数情况用Java(有大数)、Python(兼容度不高)
-
输入输出:cin cout
-
万能头文件 #include<bits/stdc++.h> VS需要自己装入相应头文件
-
数组尽量放全局
数组尽量开大 -
结构体有时候不能比较大小 需要重新定义
struct STR
{
int a;
int b;
bool friend operator <(STR a,STR b)
{
return x1.a<x2.a;
}
};
相关比赛限制
- 一秒钟可以执行多少次运算? 8e8
- 1G内存可以开多大数组?
int 2e8
256MB 5e7
可参考网站
https://vjudge.net/
https://www.nowcoder.com/
https://pintia.cn/