1.智能指针
作用:使用new从堆分配内存后,待不需要时需要使用delete将其释放,智能指针可以自动完成该动作。
2.判断奇偶性
// 方法一:通过取余号%
nums[i] % 2 == 0 && nums[j] % 2 == 1 // 偶奇
// 方法二:按位与&
(nums[i] & 1) == 0 && (nums[j] & 1) == 1 // 偶奇
// C++运算符优先级
// 取余运算符 % >> 等于比较操作符 == >> 按位与操作符 &
// 所以在方法二中需加括号调整运算的顺序
3.string类相关
3.1判断字符串是否存在
// 通过s.empty()判断存在性
if(s.empty()) return s;
3.2翻转字符串
// reverse()函数对字符串进行翻转时,参数需为字符串的迭代器!!
reverse(s.begin(), s.end());
// 当对字符串的中间位置部分进行翻转时,通过迭代器加常值的方式表示
// 尝试用string* 或者char* 指示元素,但都报错无此转换关系,可能有其余更好的表示方法
reverse(s.begin() + i, s.end() + j);
3.3长度可变字符串循环次数的设置
// 设置长度可变字符串的循环次数
// 当需要对字符串进行删减时,例如删除多余的空格时,字符串的长度会发生变化
while(i < s.size())
// 下式不可取
int len = s.size();
while(i < len)
3.4对字符串进行删减
// 对字符串进行删减时,可通过erase()函数
// start为开始删减的位置(下标表示),num为删减字符的数量
s.erase(start, num);
// 删除字符串最后一个字符
s.pop_back();
3.5读取字符串某个位置的字符
// 读取字符串某个位置的字符
// 通过下标进行访问即可,字符需要''括住
s[j] != ' ';
3.6读取字符串的最后一个元素
// 读取字符串的最后一个元素
s.back();
3.7 字符串进行扩充
// 对字符串进行扩充
// 直接使用加号+
string res = "[";
res += (to_string(node->val) + ","); // 数字无法通过""转为字符。需使用to_string()函数
res += "]";
3.8字符串分割
通过字符串数组将以","为分隔符的字符串保存起来
vector<string> split(string data, string sign){
vector<string> str;
int i = 0, j = 0;
int len = data.length();
while(i < len){
while(j < len && data[j] != ','){
j++;
}
str.push_back(data.substr(i, j - i));
i = ++j;
}
return str;
}
错误示范:
string s = "12,2,null,3";
for(char c : s) // 该方法获得的为单个字符
// 输出如下:
1 2 , 2 , n u l l , 3
3.9字符串转换为int型
string s;
std::stoi(s); // 注:该函数只适用于整数对应的字符串,如“[]”,“a”会报错
4.自定义排序函数的排序规则
4.1 sort函数
// 自定义sort()函数排序规则
// [](string& x, string& y){return x + y > y + x;}为自定义的排序规则
vector<string> strs;
sort(strs.begin(), strs.end(), [](string& x, string& y){return x + y > y + x;});
注意:
- sort()函数的前两个参数为必填项,且为排序范围首位对应的指针!!
- sort()函数前两个参数可以包含变量如下
// sort()前两个参数可包含变量 vector<int> nums; sort(nums.begin()+i, nums.begin()+i+k);
- sort()函数为左闭右开区间
// 左闭右开 vector<int> nums; sort(nums.begin(), nums.begin()+k); // 是对nums[0]到nums[k-1]这k个元素进行排序 // 不包含nums.begin()+k所指向的元素
5.幂运算
C++中幂函数为pow(),^在c++中为异或操作!!
6.变量初始化
当对多个变量同时初始化为同一个值时,应分别进行初始化,不能同时进行!!
// 对多个变量进行初始化
int a = 0, b = 0, c = 0;
// 错误示范
int a, b, c = 0;
7.对多个数值取最小值
// min()函数参数只能有两个,可通过内套该函数对多数值取最值
a = min(min(1,2),3);
8.vector数组下标
// 该代码的含义为先将tmp[j]赋值给ans,再进行j++操作
int ans = tmp[j++];
9.迭代问题
// 表达式中为两个递归函数的和时
// 先将左递归函数递归到终止,再求取右递归函数(又包含左、右递归函数)
// 以下实例中只关注l、r的变化
int l = 0, r = 3;
int mergeSort(int l, int r, vector<int>& nums, vector<int>& tmp) {
// 终止条件
if (l >= r) return 0;
// 递归划分
int m = (l + r) / 2;
int res = mergeSort(l, m, nums, tmp) + mergeSort(m + 1, r, nums, tmp);
}
// res行算法的求解步骤
/*
1.将l = 0, r = 3 ---> (左)l = 0, r = 1; --->(左) l = 0, r = 0;
| |
| ------>(右) l = 1, r = 1;
|
-----> (右)l = 2, r = 3; --->(左) l = 2, r = 2;
|
------>(右) l = 3, r = 3;
l、r的取值顺序:l = 0, r = 3 -> l = 0, r = 1 -> l = 0, r = 0 -> l = 1, r = 1
-> l = 2, r = 3 -> l = 2, r = 2 -> l = 3, r = 3
*/
10.判断条件为某个区间
while('0' <= *it <= '9') it++; // 错误用法,判断大小时必须分开写
while('0' <= *it && *it <= '9') it++; // 正确用法
11.unordered_map
在使用unordered_map时,如果存在一键多值对的可能,则只需遍历的同时存储即可,如此当出现相同的键值时,无需存储即可使用。
// 示例
// nums = [3,3], target = 6
unordered_map<int, int> dic;
for(int i = 0; i < len; i++) {
if(dic.find(target - nums[i]) != dic.end())
return {dic[target - nums[i]], i};
dic[nums[i]] = i; // 此题中数组3对应两个下标,无法存储全部,只需遍历的同时存储即可,当检测到3 + 3 = 6时,unordered_map只存储了一个键值对。