c++算法学习笔记
变量的直接初始化
变量的直接初始化对于C++语法是一个重要的功能,可以用来初始化变量
class Data{
public:Data():m_map({{1,2},{3,4}}){}void printMap(){for_each(m_map.begin(), m_map.end(), [](auto& pair){cout << pair.first << pair.second << endl;})}
private:map<int, string> m_map;
};
map的直接初始化方式为map({{},{}})或者map{{},{},{}}
算法纪要
1、能用递归就不用栈,能用stl就一定不自己实现
2、不提倡防御式编程,不校验malloc/new返回的指针是否为nullptr,不许检查内部函数入口,参数有效性
编程技巧
1、判断浮点数a和b是否相等时,不能直接用a=b,应判断fabs(a-b)是否小于某个阈值,比如1e-9
2、判断是否奇数时,使用x % 2 != 0, 不要使用x%2==1,因为可能会有负数
3、char的值作为数组下标,不太可取,因为char可能有负值
4、vector和string的使用优先于动态分配的数组
5、使用reserve避免不必要的重新分配
vector数组会有一个size和capacity的概念,size代表逻辑容量,capacity代表物理已经分配的内存的容量。默认初始化时,容量为1;resize()操作的逻辑容量,并不真正分配内存;reserver()操作用于操作内存容量,可以提前分配内存,避免扩容导致的性能下降。
考虑1个问题:
1、当size大于capacity时会发生什么?
此时物理分配的内存不够用,此时会触发自动扩容,扩容并非简单意义上接着扩容,而是分为三步:申请新内存通常为capacity的两倍(默认是2倍),复制旧内存区域的值到新内存区域,释放旧内存,更新capacity为新内存大小。
昨日一题
80. 删除有序数组中的重复项 II
class Solution {
public:int removeDuplicates(vector<int>& nums) {// 此问题中删除重复的元素,最多只能保留2次,如果小于2个元素则直接返回if (nums.size() < 3) return nums.size();// 本质上是要更新cntint cnt =2; // cnt记录新的数组位置,所以更要明确,数组该怎么更新呢for (int i = 2; i < nums.size(); i++) {if (nums[i] != nums[cnt-2]) { // 核心更新机制nums[cnt++] = nums[i];}}return cnt;}
};