0. 语法糖特性
#include<bits/stdc++.h> // 包含通用C++头文件
return {tail, head}; tie(head, tail) = myReverse(head, tail); // 返回两个值时,用tie去接收。Node* pre = nullptr // nullptr代替NULL
1. 字符函数(注意是针对字符类型char)
isupper()判断一个字符是否是大写字母
islower()判断一个字符是否是小写字母
isalpha()判断一个字符是否是字母
isalnum()判断一个字符是否是字母或者数字
isblank()判断一个字符是否是空白符
isdigit()判断一个字符是否是十进制数字
isspace()判断一个字符是否是空白符
tolower()将大写字母转换为小写字母
toupper()将小写字母转换为大写字母
2. 字符串和数字之间的转换
int num = 100;
string str = to_string(num); //整形转字符串
int number = stoi(str); //字符串转为整形 stol()是字符串转为长整形
3. 字符串转换为大小写
transform(str.begin(), str.end(), str.begin(), ::tolower);
transform(str.begin(), str.end(), str.begin(), ::toupper);
4. 字符串按格式分拆
string a = "12:59:36";
char str2[100];
memcpy(str2, a.c_str(), strlen(a.c_str()));
int u, v, w;
sscanf(str2, "%d:%d:%d", &u, &v, &w);
cout<<u<<" "<<v<<" "<<w<<endl;
5. 迭代器的二分查找
vector<int> nums{1,2,34,44,99};
int k = lower_bound(nums.begin(), nums.end(), 56) - nums.begin(); //第一个大于等于目标值的迭代器位置
int k = upper_bound(nums.begin(), nums.end(), 56) - nums.begin(); // 第一个大于目标值的迭代器位置
6. 优先队列
priority_queue<int> pq; //默认是大根堆,即队列第一个元素永远是最大的
priority_queue<int, vector<int>, greater<int>> pq; //小根堆,即队列第一个元素永远是最小的
7. 字符串按格式分割
string a = "12:59:36";
char str2[100];
memcpy(str2, a.c_str(), strlen(a.c_str()));
int u, v, w;
sscanf(str2, "%d:%d:%d", &u, &v, &w);
cout<<u<<" "<<v<<" "<<w<<endl;
8. 四舍五入保留小数
char str[10];
double num = 22.23434;
sprintf(str, "%.2f", num);
string s = str;
cout<<s<<endl;
9. 优先队列自定义排序
struct node{
int a, b;
// 在优先队列中,跟排序的规则是反的,这里是指a大的排在前面,a相同时,b大的排在前面
bool operator < (const node& node_)const{
if(a != node_.a) return a < node_.a;
return b < node_.b;
}
};
int main(){
priority_queue<node> pq;
pq.push({1,5});
pq.push({2,3});
pq.push({2,5});
while(!pq.empty()) {
cout<<pq.top().a<<" "<<pq.top().b<<endl;
pq.pop();
}
return 0;
}
10. vector
// 方法empty(); //判断容器是否为空
capacity(); //容器的容量
size(); //返回容器中元素的个数
push_back(ele); //尾部插入元素ele。
pop_back(); //删除最后一个元素
insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele
erase(const_iterator pos); //删除迭代器指向的元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
clear(); //删除容器中所有元素
at(int idx); //返回索引idx所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
end(): //返回一个指向当前vector末尾元素的下一位置的迭代器.要访问末尾元素,需要先将此迭代器减1。
// 调用函数
reverse(a.begin(), a.end()); // 逆转
return *max_element(a.begin(), a.end()) ; 返回vector,maxF中最大的元素方法
int sum = accumulate(vec.begin() , vec.end() , 42); // 累加,42为初值,accumulate定义在#include<numeric>中。
sort(nums.begin(), nums.end(), greater<int>()); // 基础升序排列
sort(vec.begin(), vec.end(), [](const vector<int> & a, const vector<int> & b) {return a[0] == b[0] ? (a[1] < b[1]) : (a[0] > b[0]);});
// vec为二维vector。根据第一个降序排序,第一个相等的话按第二个升序
// 赋初值的方法
int dis[10][10]; // 矩阵数组初始化
memset(dis, -1, sizeof(dis)); // 初始化,都赋为-1。等同两个for循环赋值
vector<int> dp(5, 1); // 初始化vector为[1,1,1,1,1]
vector<vector<int>> f(m, vector<int>(n)); 创建一个m*n的矩阵f
vector的遍历方式
for (int i = 0; i < vec.size(); ++i) // 基础遍历 for (auto i:vec)
//第二种遍历方式: 迭代器it可以看做指针
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { // 可以用auto
cout << *it << endl;} // 解引用就是该数
//第三种遍历方式:
//使用STL提供标准遍历算法 头文件 algorithm
for_each(v.begin(), v.end(), MyPrint);
11. set和map
// set 方法
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
insert(elem); //在容器中插入元素
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem); //删除容器中值为elem的元素。
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数
// map方法基本与set相同
map.insert (make_pair(key, value)) // map的插入
Map[key]如果key不存在会添加key,不会抛出异常;
Map.at(key)会检查key,如果不存在会抛出异常。
// 遍历方法
unordered_map<string, vector<string>> mp;
vector<vector<string>> ans;
for (auto it = mp.begin(); it != mp.end(); ++it) { // 哈希表的遍历方法,将set转换成vector
ans.emplace_back(it->second);
}
for (const auto [word, occ]: freq) { // 哈希表的遍历方法
if (occ == 1) {
ans.push_back(word);
}
}
// map的自定义排序
static int cmp(pair<int, int> a, pair<int, int> b){
return a.second > b.second;
}
sort(tmp.begin(), tmp.end(), cmp);
// set 与 vector相互转换
vector<int> v;
v = {1,2,2,3,3,4}; //建立vector
set<int> st(v.begin(), v.end()); //在构造函数中可以直接实现vector转set
v.assign(st.begin(), st.end()); //用assign实现set转vector
// map转vector
// 转为pair以对value进行排序。哈希表转vector
vector<pair<int, int>> tmp;
for(auto it = ht.begin(); it!=ht.end(); it++){
tmp.push_back(pair<int, int>(it->first, it->second));
}
12. string
// 常用方法
find(const string& str, int pos = 0) //查找str第一次出现位置,从pos开始查找
rfind(const string& str, int pos = npos) //查找str最后一次位置,从pos开始查找
replace(int pos, int n, const string& str) //替换从pos开始n个字符为字符串str
insert(int pos, const char* s) //插入字符串
substr(int pos = 0, int n = npos) //返回由pos开始的n个字符组成的字符串(截取子串)
push_back()
pop_back()
// 遍历string
for (auto & str : balloon) {
map[str] = 0;
}
c_str():生成一个const char*指针,指向以空字符终止的数组。或者,转成c语言字符串;
13. STL方法
for_each(iterator beg, iterator end, _func); // 遍历算法 遍历容器元素 _func 函数
find(iterator beg, iterator end, value); // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
find_if(iterator beg, iterator end, _Pred); // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
adjacent_find(iterator beg, iterator end); // 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
bool binary_search(iterator beg, iterator end, value); // 查找指定的元素,查到 返回true 否则false
count(iterator beg, iterator end, value); // 统计元素出现次数
count_if(iterator beg, iterator end, _Pred); // 按条件统计元素出现次数
sort(iterator beg, iterator end, _Pred); // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
random_shuffle(iterator beg, iterator end); // 指定范围内的元素随机调整次序
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 容器元素合并,并存储到另一容器中
reverse(iterator beg, iterator end); // 反转指定范围的元素
swap(container c1, container c2); // 互换两个容器的元素
accumulate(iterator beg, iterator end, value); // 计算容器元素累计总和
fill(iterator beg, iterator end, value); // 向容器中填充元素
set_intersection // 求两个容器的交集
set_union // 求两个容器的并集
set_difference // 求两个容器的差集