C++扩充零散知识点

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;});

注意:

  1. sort()函数的前两个参数为必填项,且为排序范围首位对应的指针!!
  2. sort()函数前两个参数可以包含变量如下
    // sort()前两个参数可包含变量
    vector<int> nums;
    sort(nums.begin()+i, nums.begin()+i+k);
  3. 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只存储了一个键值对。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值