头文件互相包含
Error 编写 C++ 代码时偶尔会遇到两个类需要相互引用的情况,如果在 h 文件中相互包含会导致 “has not been declared” 等声明问题,此时需要使用前置声明的方式来解决该问题 ...
Error 编写 C++ 代码时偶尔会遇到两个类需要相互引用的情况,如果在 h 文件中相互包含会导致 “has not been declared” 等声明问题,此时需要使用前置声明的方式来解决该问题 ...
this notebook is based on Cherno‘s Video Class in YouTube ;if there is sth get confused,I can recheck the video which talk about it, or just google it. this is not totally for newbie, so some basic information we should search it And this is a important websize to tell us basic info about C++. ToDo: using c++ and Python to finish the leetcode. review data structure when we code. eorganize the notebook by onenote** and leetcode 后续可能会添加 Effetive C++中的相关内容 C++ Switch语句 Attention: ...
主要介绍一些常用数据类型的一些method,区别还有一些特殊的定义; priority_queue 默认是大顶堆,great的话是小顶堆,less的话是大顶堆,自定义的话不知道是不是一致的 set默认top是小顶,这个大小我就不知道了,自定义的话,好像和我想得是一致的 所有的动态容器都是存放在heap上的,像是什么Vector,String,unordered_map之类的 指定精度的输出和计算 在腾讯的笔试中出现的需要指定精度和指定的计算精度的分析,在使用常数的时候一定要使用.0去修正一个方法。 Vector 动态数组 Vector中的一些常用的函数,方法,以及一些属性介绍和辨析 emplace_back & push_back(在末尾添加元素) empalce_back 直接在数组的末尾进行构造,而push_back借助于构造的临时变量再将其加入数组末尾,所以在一些操作中empalce_back对于空间时间的效率是会更高的,但是如果我们有重复构筑的数据的话,可能就需要使用push_back。 要注意实际上vector中并没有append的方法。 初始化方法 主要有几种常用的构造函数,在这里主要介绍的是关于多维度的初始化构造方式。 cpp vector<int> v = {7, 5, 16, 8}; // 最基本的定义 // 通过大括号来设定多级的vector的初始值 vector<vector<char>> value = { {'5','3','.','.','7','.','.','.','.'}, {'6','.','.','1','9','5','.','.','.'} }; 常用的长度和常量 cpp vector<vector<int>> vec(size1,vector<int>(size2,defaultvalue)); Unordered_map&set哈希结构 CPP中hash table的实现数据类型: 实际上就是无序表,针对不同情况下的基本的定义方式,理念相同,针对不同的应用场景 ...
文章的部分内容被密码保护: --- DON'T MODIFY THIS LINE --- @Aiken 2021 简明的描述相应的框架和提醒分析,不输出冗余内容,结合笔记和跳转链接进行具体的复习,该文只作为大纲使用。 适用的情况分析 算法的具体框架和思路 特殊情况描述 怎么读取命令行的输入,在笔试的时候可能会需要 C++笔试读取输入的操作 待整理: Link1 ;Link2 输入通常使用while+cin»来进行,这种方式也可以直接读入整行的string; 需要注意的是,这种方式的话,如果使用的是getline,当遇到换行符的时候cin会直接停止继续输入; cpp while(cin>>a>>b); // 主要是按照类型来进行cin,操作应该是通过空格来分割的。 // 按照我们执行的次数来进行指定次数的读取操作 以指定符号分割的字符串输入 char str[3][11]; cin.getline(str[0], 11, ','); //接收最多10个字符 ,以‘,’作为结束符 cin.getline(str[1], 11, ','); cin.getline(str[2], 11); //默认结束符 enter 常见数据类型和特殊专题 经常在那种预设值出问题,导致不会更新后续的max or min ...
文章的部分内容被密码保护: --- DON'T MODIFY THIS LINE --- @Aiken 2021; 汇总LeetCode刷题以及刷《剑指offer》过程中遇到的一些不会做的题或者启发性很强的题目等等;内容主要以以下几个方面为主: 题目-题解-相关注释; 相关难点分析; 相关知识点索引 同时copy到数据结构或者c++的文档中) 《Fuck Algorithm》 针对各个专题指向性的去刷一些Leetcode中的题目,通过对这些题目进行分析整合来对巩固各个知识点,这一部分的代码整合到/leecode文件夹中,但是主要可能整合在md中; 这里可以顺便把git的内容整理一下,本地的git操作流程 最近先把数据结构刷了,变刷变看后面的搜索等等的内容,一部分一部分的往后看 第一课中回溯和其他规划的题还没看,后续再看看 思考C++中多返回值的设计 数据结构的存储方式 数据结构的存储方式 (物理层面的存储方式):数组(顺序存储)和链表(链式存储)。 最底层的存储架构上基本上只有这两种实现的方式,更高维的才是:栈、队列、堆、树、图这些高层结构; 而这些实现的高层实现上,分别使用量中架构有啥优缺点: 综上,数据结构种类很多,甚至你也可以发明自己的数据结构,但是底层存储无非数组或者链表,二者的优缺点如下: 数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N);而且你如果想在数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)。 链表因为元素不连续,而是靠指针指向下一个元素的位置,所以不存在数组的扩容问题;如果知道某一元素的前驱和后驱,操作指针即可删除该元素或者插入新元素,时间复杂度 O(1)。但是正因为存储空间不连续,你无法根据一个索引算出对应元素的地址,所以不能随机访问;而且由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间。 二分查找专题 由于我经常写错二分查找的边界判断条件,所以这里进行一个整理操作: 二分查找总结专题 后续整理的时候在进行阅读一下,加深一下理解 其中需要注意的是: 我们使用 left+(right-left) /2 来代替 (l+r)/2 ,因为这样的话可以防止right和left太大溢出的操作; mid +- 1 以及最终的返回条件 <= 还是小于 我们分情况来讨论: 求的是特定值,求的是左右的边界值的时候, cpp int binary_search(int[] nums, int target) { int left = 0, right = nums.length - 1; while(left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; } else if (nums[mid] > target) { right = mid - 1; } else if(nums[mid] == target) { // 直接返回 return mid; } } // 直接返回 return -1; } int left_bound(int[] nums, int target) { int left = 0, right = nums.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; } else if (nums[mid] > target) { right = mid - 1; } else if (nums[mid] == target) { // 别返回,锁定左侧边界 right = mid - 1; } } // 最后要检查 left 越界的情况 if (left >= nums.length || nums[left] != target) return -1; return left; } int right_bound(int[] nums, int target) { int left = 0, right = nums.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; } else if (nums[mid] > target) { right = mid - 1; } else if (nums[mid] == target) { // 别返回,锁定右侧边界 left = mid + 1; } } // 最后要检查 right 越界的情况 if (right < 0 || nums[right] != target) return -1; return right; } 数据结构的基本操作 所有数据结构的基本操作一般都局限在 遍历+访问,更具体一点就是:增删改查; ...