目录
链表
ListNode* p=new ListNode(0,head);
栈和队列
stack——
stack<int> st;
st.push(1);
st.push(2);
// st: 1 2
st.top(); // 2
st.size(); // 2
st.pop(); // st: 1
st.empty(); // false
queue——
queue<int> que;
que.push(1);
que.push(2);
// que: 1 2
que.front(); // =1
que.back(); // =2
que.size(); // 2
que.pop(); // que: 2
que.empty(); // false
deque——
deque<int> deq;
deq.push_back();
deq.push_front();
deq.pop_back();
deq.pop_front();
deq.front();
deq.back();
deq.size();
deq.empty();
堆
// 小顶堆
class mycomparison {
public:
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second > rhs.second;
}
};
// 定义一个小顶堆,大小为k
priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;
pri_que.push(元素);
pri_que.pop();
pri_que.top();
pri_que.size();
数组
注意:
- 二维数组的size不是其中一维数组的数量而是整个大小。
- vector初始化的时候规定了大小的话,之后就不能使用push_back来添加元素,只能使用下标来添加。
vector<int> vec(数组长度,初始化的值);
vector<vector<int>> dp(长度,vector<int>(一维数组长度,0)); // 创建二维数组
vec.push_back(元素);
vec.pop_back();
vec.insert(插入下标,插入元素);
vec.size();
vec.clear(); // 只能清除vector里面的数据,但是内存空间没有释放
vec.begin();
vec.end();
// 创建二维数组
int nums[3][3]={0}; // 创建3*3大小的数组,并且全部初始化为0
list
list<vector<int>> que;
std::list<vector<int>>::iterator it=que.begin();
while(position--){
it++;
}
que.insert(it,元素);
set
//优先使用unordered_set,因为它的查询和增删效率是最优的
//如果需要集合是有序的,那么就用set
//如果要求不仅有序还要有重复数据的话,那么就用multiset
unordered_set<int> result_set;
unordered_set<int> nums1_set(nums1.begin(),nums1.end());
//保证nums1一定包含nums2的所有元素
//如何遍历
for(int num:nums2){
if(nums1_set.find(num)!=nums1_set.end()){ //找不到num
result_set.insert(num);//插入num
}
}
result_set.begin();
result_set.end();
map
std::unordered_map<int,int> map;
auto iter=map.find(键);
if(iter!=map.end()) return {iter->second,i}; //如果找到了某键,就返回它的值
map.insert(pair<int,int>(nums[i],i));//插入键值对
// 使用迭代器扫map
for(unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++)
// 得到map里面某键的个数
int count = map.count(键);
字符串
string str=s.substr(起始下标,长度); //分割字符串
reverse(起始下标,结束下标); //反转字符串
s.insert(开始插入的下标位置,插入的字符串); // 字符串中插入
s.erase(删除的起始下标,删除的长度); // 字符串中删除
s.compare(ss);
s.replace(起始下标,长度,要替换为的字符串);
s.find(字符串, 起始下标); //在字符串的某点开始往后找,找到对应字符串之后返回对应段的起始下标
string(n,'.'); //建立一个n个点的字符串
reverse(s.begin(),s.end());
s.push_back(char c);
s.pop_back();
s.empty();
s.back(); // 返回尾部元素
s.front(); // 返回头部元素
//数值转string——
to_string(num);
//string转数值——
#include <srting>
stoi(str); // 转int
stol(str); // 转long
stoll(str); // 转longlong
// char 转 string——
string s(1, 字符);
// getline的用法——得到有空格的字符串
cin>>n>>ch; // 如果getline之前有cin,会有一个换行符没有输入进去
getchar(); // 需要用getchar来吸取换行符,否则使用getline得到的就是回车了
getline(cin,s);
// 分割字符串,没有现成的,只能自己写:
vector<string> Split(string ss,char sign){
vector<string> res;
int size=ss.size();
string tmp="";
for(int i=0;i<size;i++){
if(ss[i]!=sign) tmp+=ss[i];
else if(tmp!=""){
res.push_back(tmp);
tmp="";
}
}
if(tmp!="") res.push_back(tmp);
return res;
}
int等
// int最大值、最小值
INT_MAX INT_MIN
// long long 最值
LLONG_MAX LLONG_MIN
ELSE
左移运算符(<<)——a = a<< 2 ,相当于该数乘以2。
右移运算符(>>)——a=a>>2 ,相当于该数除以2。
// 设置保留小数
cout<<fixed<<setprecision(2)<<num<<endl; // 保留两位小数
isalpha(字符); // 判断是否是字母
isdigit(字符); // 判断是否是数字
tolower(字符); // 字母转小写
toupper(字符); // 字母转大写