
编码
dr.xun
迭代
展开
-
API与C++中的API
1、什么是API1、是对某个问题的抽象,及用户与解决该问题的软件组件之间进行交互的方式;2、定义可复用模块,该模块可以嵌入到用户的应用程序中;3、一个明确定义的接口,可以为其他软件提供特定服务。原创 2022-09-11 18:12:28 · 1750 阅读 · 0 评论 -
安全编码之基于栈的缓冲区溢出
安全编码之基于栈的缓冲区溢出原创 2022-06-04 11:42:44 · 384 阅读 · 2 评论 -
Linux编程之fork(创建一个进程)
一、API头文件:unistd.hpid_t fork();作用:如果fork()调用成功,就会使内核建立一个新的进程,所建的新进程是调用fork()的进程的副本。系统调用fork()没有参数,它返回一个pid_t类型的值pid。pid被用来区分父进程和子进程。在父进程中,pid被置为一个非0的正整数;在子进程中,pid被置为0。根据fork()在父进程和子进程中的返回值不同,程序员可以据此为两个进程指定不同的工作。二、例子#include <stdio.h>#include原创 2022-05-08 23:01:41 · 3788 阅读 · 0 评论 -
软件修改不可避免
修改代码的起因四种:(1)添加新特性;新需求需要实现(添加新的功能或者添加新功能并替换之前的功能)(2)修正bug;(3)改善设计;(4)优化资源使用。添加新特性与修正bug对于程序员来说,可以统一看成是改变软件的行为。行为:行为对于软件来说是最重要的一样东西。软件的用户要依赖于软件的行为。用户喜欢我们添加行为(前提是新的行为确实是他们所需要的),然而如果我们改变或移除了他们原本所依赖的行为(引入bug),那么他们就不会再相信我们。行为与功能:行为包含功能、性能、可维护性等功能,更原创 2022-04-24 21:28:56 · 350 阅读 · 0 评论 -
C++编译器解析operator->机制及自锁定技术实现
机制说明编译器可以一个->表达式多次应用operator->,直到找到原始指针。例子好用的RAII手法template<typename T>struct LockingProxy{ LockingProxy(T* pObj) : pointee_ (pObj ) { pointee_->lock(); } ~LockingProxy() { pointee_->unlock(); } T* operator->() c原创 2022-04-19 23:12:04 · 688 阅读 · 0 评论 -
C++单例实现实践
简介保证一个class只有一个实体,并为它提供一个全局访问点。种经过改进的全局变量。懒汉模式版本一class Singleton {public : static Singleton* instance() { if (!pInstance_) pInstance = new Singleton(); return pInstance_; }private : Singleton(); Singleton(const Singleton&); ~原创 2022-04-15 22:56:49 · 640 阅读 · 0 评论 -
内存管理——小型对象分配器实践输出
【注】此实践的基本思路来自《Modern C++ Design》四层结构实现Chunkstruct Chunk{ Chunk() : pData(nullptr), firstAvailableBlock_(0), blocksAvailable_(0) { } Chunk(size_t blockSize, unsigned char blocks) { pData = new unsigned char[blockSize * blocks]; firstAvailab原创 2022-04-12 22:55:56 · 1416 阅读 · 0 评论 -
架构演进简介
1、命令查询职责分离模式(Command Query Responsibility Segregation,CQRS)读与写分离2、六边形架构分层:内部和外部3、洋葱架构(Onion Architecture)分离:基础设施;业务应用 外层依赖内层。 内层对外层无感知。4、COLA架构(面向对象分层架构)左边:分层架构右边:COLA分层架构 规则设计:“一个应用至少要有3个组件:应用层、领域层和基础实施层。”...原创 2022-04-01 23:43:13 · 182 阅读 · 0 评论 -
利用模板别名using实现TypeList
实现TypeListtemplate<typename T, typename U>struct TypeList{ using Head = T; using Tail = U;};背后的机制template参数可以是任何型别,包含该template的其他具现体。作用TypeList 内部没有任何数值:它们的实体是空的,不含任何状态,也未定义任何函数。执行期间t不带任何数值。它存在的理由只是为了携带型别信息。使用例子:using CharList = TypeLis原创 2022-03-26 23:38:05 · 712 阅读 · 0 评论 -
模板技术之编译期识别类型转换和继承性
问题如何识别两个模板参数T和U是否有继承关系?原理sizeof的威力sizeof可以用于任何表达式,在编译期评估表达式类型的大小。因此,sizeof可以感知重载、模板实例化、转换规则,或任何可发生于C++表达式身上的机制。识别类型转换能力机制运用sizeof和重载函数。1、函数重载提供选择分支提供两个重载函数:一个接受目标类型U——1号函数,另一个接受其它任何类型——2号函数。用户用类型T来调用这些函数,用户想知道T是否可以转换成U。如果1号函数被调用,说明T可以转换成U,否则无法转换成U。原创 2022-03-23 23:05:59 · 1191 阅读 · 0 评论 -
模板技术之型别转换实现Tag
型别映射问题:C++中不存在函数模板偏特化有时我们期待型别转换,输入一种数据类型,输出另一种数据类型,如下代码所示。template<typename T, typename U>T* Create(const U& arg){ return new T(arg);}有时,系统中存在旧代码,如Widget,需要两个参数才能构建出对象,第二个参数固定为-1,它的派生类则没有这种问题。由于函数模板特性限制,我们如下代码不符合规则。//非法代码template<t原创 2022-03-22 23:43:19 · 1144 阅读 · 0 评论 -
std::thread使用注意资源回收问题
一、线程1、启动线程存在的固有开销1. OS分配内核资源、堆栈空间2. 将线程加入调度器2、每个线程都需要一份独立的堆栈空间对于32位系统,一个线程占用1MB的栈空间3、线程间的任务调度,OS需要做上下文切换因此,1. 线程启动后,需要关注其销毁2. 系统资源有些,需要考虑启动线程的数量是否合适二、thread使用问题1、启动线程,主线程抛异常,异常退出例子:#include <iostream>#include <thread>using namesp原创 2021-10-04 11:35:19 · 2375 阅读 · 0 评论 -
LeetCode 31. 下一个排列
一、题目实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]示例 2:输入:nums = [3,2,1]输出:[1,2,3]示例 3:输入:nums = [1,1,5]输出:[1,5,1]示例 4:输入:nums = [1]输出:[1]提示:1 <= num原创 2021-07-11 14:29:42 · 105 阅读 · 0 评论 -
LeetCode 30. 串联所有单词的子串
一、题目给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”, words = [“foo”,“bar”]输出:[0,9]解释:从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。输出的顺序不重要, [9,0] 也原创 2021-07-11 14:21:31 · 144 阅读 · 0 评论 -
LeetCode 88. 合并两个有序数组
一、题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]示例 2:输入:nums1 = [1],原创 2021-07-05 22:23:05 · 114 阅读 · 0 评论 -
LeetCode 53. 最大子序和
一、题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [0]输出:0示例 4:输入:nums = [-1]输出:-1示例 5:输入:nums = [-100000]输出:-100000提示:1 <原创 2021-07-04 20:18:20 · 86 阅读 · 0 评论 -
LeetCode 217. 存在重复元素
一、题目给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/contains-duplicate二、题解原创 2021-07-04 19:36:23 · 135 阅读 · 0 评论 -
LeetCode 29. 两数相除
一、题目给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2示例 1:输入: dividend = 10, divisor = 3输出: 3解释: 10/3 = truncate(3.33333…) = truncat原创 2021-06-30 20:09:06 · 128 阅读 · 0 评论 -
LeetCode 28. 实现 strStr()
一、题目实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。示例 1:输入:haystack = “原创 2021-06-27 20:38:25 · 125 阅读 · 1 评论 -
LeetCode 27. 移除元素
一、题目给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝原创 2021-06-23 21:06:04 · 140 阅读 · 0 评论 -
LeetCode 26. 删除有序数组中的重复项
一、题目给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicate转载 2021-06-23 20:45:30 · 163 阅读 · 0 评论 -
智能指针实现Impl模式
widget.h:class Widget{ public: Widget(); ~Widget(); // ... other funcs Widget(const Widget& rhs); / Widget& operator=(const Widget& rhs); private: struct Impl; std::unique_ptr<Impl> pImpl;};widget.cpp:struct Widget::Impl原创 2021-06-20 15:56:29 · 251 阅读 · 0 评论 -
实现make_unique
template<typename T, typename... Ts>std::unique_ptr<T> make_unique(Ts&&... params){ return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));}原创 2021-06-20 15:38:11 · 354 阅读 · 0 评论 -
LeetCode 24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]提示:链表中节点的数目在范围 [0, 100] 内0 <= Node.val <= 100来源:力扣(LeetCode)链接:https://leetcode..原创 2021-06-14 11:14:02 · 106 阅读 · 0 评论 -
LeetCode 23. 合并K个升序链表
一、题目给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:l...原创 2021-06-12 09:22:33 · 138 阅读 · 0 评论 -
LeetCode 22. 括号生成
一、题目数字 n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/generate-parentheses著作权归领扣...原创 2021-06-09 21:06:40 · 210 阅读 · 0 评论 -
LeetCode 21. 合并两个有序链表
一、题目将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按 非递减...原创 2021-06-09 20:20:14 · 117 阅读 · 0 评论 -
LeetCode 20. 有效的括号
一、题目给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例2:输入:s = "()[]{}"输出:true示例3:输入:s = "(]"输出:false示例4:输入:s = "([)]"输出:false示例5:输入:s = "{[]}"输出:true提示:...原创 2021-06-06 21:34:24 · 66 阅读 · 0 评论 -
LeetCode 19. 删除链表的倒数第 N 个结点
一、题目给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 &l...原创 2021-06-06 20:32:14 · 168 阅读 · 0 评论 -
LeetCode 18. 四数之和
一、题目给定一个包含n 个整数的数组nums和一个目标值target,判断nums中是否存在四个元素 a,b,c和 d,使得a + b + c + d的值与target相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例 1:输入:nums = [1,0,-1,0,-2,2], target = 0输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]示例 2:输入:nums = [], target =...原创 2021-06-06 19:51:55 · 87 阅读 · 0 评论 -
LeetCode 17. 电话号码的字母组合
给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例 1:输入:digits = "23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]示例 2:输入:digits = ""输出:[]示例 3:输入:digits = "2"输出:["a","b","c"]提示:0 <= digits.le...原创 2021-06-06 13:20:05 · 120 阅读 · 0 评论 -
LeetCode 16. 最接近的三数之和
一、题目给定一个包括n 个整数的数组nums和 一个目标值target。找出nums中的三个整数,使得它们的和与target最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。提示:3 <= nums.length <= 10^3-10^3<= nums[i]<= 10^...原创 2021-05-28 19:52:14 · 118 阅读 · 0 评论 -
LeetCode 15. 三数之和
一、题目给你一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 <= nums.length &l...原创 2021-05-26 21:37:06 · 137 阅读 · 0 评论 -
LeetCode 14. 最长公共前缀
一、题目编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例 1:输入:strs = ["flower","flow","flight"]输出:"fl"示例 2:输入:strs = ["dog","racecar","car"]输出:""解释:输入不存在公共前缀。提示:0 <= strs.length <= 2000 <= strs[i].length <= 200strs[i] 仅由小写英文字母组成..转载 2021-05-23 19:10:08 · 96 阅读 · 0 评论 -
LeetCode 13. 罗马数字转整数
一、题目罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做II,即为两个并列的 1。12 写做XII,即为X+II。 27 写做XXVII, 即为XX+V+II...原创 2021-05-23 14:09:48 · 113 阅读 · 0 评论 -
LeetCode 12. 整数转罗马数字
一、题目罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做II,即为两个并列的 1。12 写做XII,即为X+II。 27 写做XXVII, 即为XX+V+II...原创 2021-05-23 10:36:54 · 270 阅读 · 0 评论 -
LeetCode 11. 盛最多水的容器
一、题目给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) 。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为49。...原创 2021-05-23 09:43:04 · 97 阅读 · 0 评论 -
LeetCode10:正则表达式匹配
给你一个字符串s和一个字符规律p,请你来实现一个支持 '.'和'*'的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。示例 1:输入:s = "aa" p = "a"输出:false解释:"a" 无法匹配 "aa" 整个字符串。示例 2:输入:s = "aa" p = "a*"输出:true解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 '...原创 2021-05-15 21:22:34 · 113 阅读 · 0 评论 -
LeetCode 9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 1:输入:x = 121输出:true示例2:输入:x = -121输出:false解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入:x = 10输出:false解释:从右向左读, 为 01 。因此它不是一个回文数。..原创 2021-04-11 18:13:17 · 81 阅读 · 1 评论 -
LeetCode 8. 字符串转换整数 (atoi)
请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数(即,"123"...转载 2021-04-11 17:51:29 · 129 阅读 · 0 评论