基础知识
C++
向量vector
#include<vector>
using namespace std;
定义
vector<int> vi;
vector<vector<int>> vii;
访问:1.下标,2.迭代器
for(int i=0; i<vi.size(); i++)
for(vector<int>::iterator it=vi.begin();it!=vi.end(); it++)
常用函数
- vi.push_back(x) 在末尾添加元素
- vi.pop_back() 删除末尾元素
- vi.size() 获取大小
- vi.clear() 清空
- vi.insert(it, x); 在it处插入元素x
- vi.erase(it); 删除it处的元素
- vi.erase(first, last); 删除[first, last)内所有元素
vector的初始化
初始化多个值
vector<int> list = {1,2,3.0,4,5,6,7};
vector<int> list3 {1,2,3.0,4,5,6,7};
根据数组或其他vector初始化
int a[5] = {...};
vector<int> list(a, a+sizeof(a)/sizeof(int));
vector<int> list
vector<int> list3(list.begin() + 2, list.end() - 1);
set 集合
内部有序,不含重复元素
#include<set>
using namespace std;
定义
set<int> s;
访问:只能通过迭代器访问
for(vector<int>::iterator it=s.begin(); it!=s.end(); it++)
常用函数
- s.insert(x); 插入
- s.find(value); 返回值为value的迭代器
- s.erase(it); 删除it处的元素
- s.erase(value); 删除value;
- s.erase(first, last); 删除区间为[first, last]内的元素
- s.size()
- s.clear()
字符串
#include<string>
using namespace std;
定义
string st;
访问
for(int i=0; i<st.length(); i++) printf("%c", st[i])
for(c:s) {if(c==' ')}
输入输出
//输入输出一整行
cin>>st;
cout<<st;
常用函数
- str3 = str1 + str2; //拼接
- == , != , < , <= , > , >= 字典序
- length() / size() 长度
- str.insert(pos, str2); //在str的pos位置插入str2
- str.erase(it) / str.erase(first, last)
- str.clear()
- str.substr(pos, len); //返回位置pos开始,长度为len的子串
- str.find(str2); 返回str2在str中第一次出现的位置,如果不是子串,返回string::npos
- str.replace(pos, len, str2); // 把str中从pos开始,长为len的子串替换为str2
- str.replace(it1, it2, str2); // 把str中[it1, it2)替换为str2
- s.resize(length)
int pos = s.find(" “) ; pos:子串所在位置
s.replace(pos, 1, “%10”); //将s[pos+1]替换为”%10"
int pos = s.find(" ");//查找子串在目前字符串中的位置,找不到返回-1
while( pos != -1 )
{
s = s.replace(pos,1,"%20");//将字符串中以某个位置开始的指定长度替换为目前字符串
pos = s.find(" ");
}
map
#include<map>
using namespace std;
定义
map<string, int> mp;
访问
mp['c'] = 20;
for(map<string, int>::iterator it = mp.begin(); it!=mp.end(); it++)
it->first 访问键。it->second 访问值
常用函数
- mp.find(‘b’); // 返回键为key的映射的迭代器
- mp.erase(it); // mp.erase(key); // mp.erase(first, last);
- mp.size();
- mp.clear();
stack 栈
#include<stack>
using namespace std;
定义
stack<int> st;
访问
st.top(); //访问栈顶元素
函数
- st.push(x); //压入
- st.top(); // 取栈顶
- st.pop(); // 弹出
- st.empty(); //判空
- st.size();
queue 队列
#include<queue>
using namespace std;
定义
queue<int> q;
访问
q.front(); //访问队首元素
q.back(); //访问队尾元素
常用函数
- q.push(x); 压入
- q.pop(); 弹出队首元素
- q.empty(); 贩毒案是否为空 //-> true/false
- q.size();
deque 双端队列
#include<queue>
using namespace std;
定义
deque<int> dq;
增
dq.push_front(x) 头部增加一个元素X
dq.push_back(x) 尾部增加一个元素x
dq.insert(it, x) it位置前增加一个元素x
dq.insert(it, n, x) it位置前增加n个相同的元素x
dq.insert( it, first, last) it前插入另一个相同类型向量的[forst,last)间的数据
删
Iterator erase(iterator it):删除双端队列中的某一个元素
Iterator erase(iterator first,iterator last):删除双端队列中[first,last)中的元素
void pop_front():删除双端队列中最前一个元素
void pop_back():删除双端队列中最后一个元素
void clear():清空双端队列中最后一个元素
algorithm头文件的函数
#include<algorithm>
using namespace std;
- max(x, y); //返回x,y中的最大值
- min(x, y); //返回x,y中的最小值
- abs(x); // 返回x的绝对值
- swap(x, y); // 交换x和y的值
- reverse(it1, it2); // 将数组指针在[it1, it2)中的元素反转
int a[10] = {10,5,6,11,13,15};
reverse(a, a+5);
- fill() 数组或容器对应范围内赋相同值
int a[10];
reverse(a, a+5, 233);
- sort(); 排序
int a[10] = {10,5,6,11,13,15};
sort(a, a+5); // 从小到大排序
bool cmp(int a, int b){
return a>b;
}
int a[10] = {10,5,6,11,13,15};
sort(a, a+5, cmp); // 从大到小排序
位运算
二叉树
BFS
DFS
vector<int> levelOrder(TreeNode* root) {
vector<int> res;
if(!root)
return res;
queue<TreeNode*> q;
q.push(root);
while(q.size()){
//取队首元素top
TreeNode* node=q.front();
q.pop();
//访问队首元素top并弹出
res.push_back(node->val);
//将队首元素top的下一层元素全部入队,并设置成已入队
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
}
return res;
}
排列组合
C n m = n ! m ! ( n − m ) ! C^m_n=\frac{n!}{m!(n-m)!} Cnm=m!(n−m)!n! A n m = n ! ( n − m ) ! A^m_n=\frac{n!}{(n-m)!} Anm=(n−m)!n!
DFS
31
33
54
BFS
32
55
动态规划
42
46
63
排序
45
二分法
53
位运算
56
65
滑动窗口/双指针
57
字符串
58
递推
【约瑟夫环】62