- 博客(26)
- 收藏
- 关注
原创 对C++多态的理解
多态说的就是不同的对象收到相同的任务输出不同的结果。静态多态#include <iostream>int sum(int a, int b) { return a + b;}double sum(double a, double b) { return a + b;}int main() { std::cout << sum(1,2) << std::endl; std::cout << sum(3.3,
2021-12-30 13:51:17
287
原创 【操作系统】对虚拟内存的理解与总结
虚拟内存首先我们说一说为什么会有虚拟内存这么一个概念。我们可以设想一下如果我们启动多个程序(QQ、微信、谷歌浏览器…等等),这些程序都会到内存中去运行,程序越多内存剩下的容量就会越来越小甚至会不足。为了解决这样的问题就提出了虚拟内存。让每个程序都认为自己拥有所有的内存空间。这是我们脑海里可以浮现出一种结构就是进程->虚拟内存->物理内存(下文都用进程为例),某一个进程通过访问虚拟地址再去访问物理内存,虚拟地址就像是一座桥梁连着进程与物理地址,进程就会通过CPU中的内存管理单元(MMU)把虚拟
2021-09-07 16:37:36
223
原创 对线程池的理解
首先我们聊一聊为什么要用线程池?在Linux当中有select/poll/epoll这三个I/O复用的方法,我们可以想到如果服务器客户量很大比如说1000个,那么使用多线程和多进程都不合适了,多线程创建需要创建时间,加上执行逻辑再加上销毁使用的时间,这是一个很大的开销。而且cpu也只会调用一个县城去执行,那么我们开1000个就会有更多的开销了,所以这里就提出了线程池。线程池线程池它就是一个池子,里面有固定数量的线程如果是CPU密集型应用,则线程池大小设置为:CPU数目+1; 如果是IO密集型应用,则线程
2021-07-14 20:58:39
140
原创 UNIX/LINUX上常见的I/O模型
阻塞I/O应用程序使用read函数,通过系统调用到内核态查看数据是否准备好,等待过程中线程就会在挂起状态,当数据到达以后数据准备好,进行拷贝数据也就是从内核当中把数据拷贝到我们的buf数组里,拷贝完成以后再返回给用户态。阻塞I/O的线程不能往下执行,只能等待。非阻塞I/O线程通过read转到内核态,如果数据没有准备好,会返回-1再带上EAGAIN,接下来再调用一次直到数据准备好。等数据准备好以后再从内核当中把数据拷贝到用户空间,拷贝完成后返回。好处就是线程不会挂起,程序可以往下执行做一些其他的事。
2021-07-14 15:07:13
91
原创 网络I/O
网络I/O网络IO部分经常会被问到同步/异步、阻塞/非阻塞相关知识点,下面来总结一下我对这些知识点的理解。网络IO有两个阶段第一个是数据就绪,第二阶段是数据读写。数据就绪数据就绪可以理解为数据有没有到达。那我们该怎么判断数据有没有到达呢?可以通过TCP接受缓冲区有没有数据到达来判断数据就绪,如果有数据那么就说明有数据到达了,如果TCP接受缓冲区没有数据那么说明没有数据到达。数据就绪阶段又可以分为两个知识点,阻塞/非阻塞。阻塞:调用了读写(I/O)方法的线程进入阻塞状态。通俗的来说就是当我调用r
2021-07-14 12:13:12
201
原创 C++ 函数模板
函数模板在C++当中会有一些情况,比如说静态多态的情况,我们需要相加两个参数,代码如下:int Add (int a, int b) { return a + b;}int Add (double a, double b) { return a + b;}如果对每个希望去相加的类型都要写一个函数,是一种非常繁琐的事情,这时就体现出了模板函数的用途了。我们可以把模板函数看作是一个公式,可以用来生成针对特定类型的函数版本。那么Add函数就可以写成如下形式:template <type
2021-05-24 22:34:44
121
原创 5. 最长回文子串
题目给你一个字符串 s,找到 s 中最长的回文子串。示例示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”示例 3:输入:s = “a”输出:“a”示例 4:输入:s = “ac”输出:“a”思路这道题适用动态规划解决是一个很好的办法。先确定dp数组,以及下表的含义布尔类型的dp[i][j]:表示区间[i, j]的子串是否为回文字串,如果是那么dp[i][j]为true,否则
2021-04-01 15:42:15
75
原创 1.两数之和
题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。2:输入:nums = [3,2,4], target = 6输出:[1,2
2021-04-01 12:21:44
65
原创 LeetCode142.环形链表II
题目描述给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例提示链表中节点的数目范围在范围 [0, 104] 内-105 <= Node.val <= 105po
2021-02-12 13:36:36
87
原创 LeetCode 707. 设计链表
设计链表题目描述示例提示思路代码题目描述设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 v
2021-02-09 17:30:00
133
原创 LeetCode 203. 移除链表元素
题目描述删除链表中等于给定值 val 的所有节点。示例输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5解题思路主要思路就是把当前节点的前继节点存其来,遇到和val相同的就可以给前继节点的next当前节点的next,这样就可以删除了,但是有连续的就有点麻烦了,所以用哨兵法来解决这个问题非常方便。先new一个哨兵初始化为0并让该哨兵的next指向head。当前节点为head,前继就是哨
2021-02-08 17:28:38
77
原创 二叉搜索树的第k大节点
二叉搜索树的第k大节点题目描述示例解题思路代码结果题目描述给定一棵二叉搜索树,请找出其中第k大的节点。示例示例 1:输入: root = [3,1,4,null,2], k = 13/ 1 42输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 35/ 3 6/ 2 4/1输出: 4限制:1 ≤ k ≤ 二叉搜索树元素个数解题思路首先就是把所有的val都放到一个vector里,因为queue是先进先
2021-02-05 14:26:01
152
1
原创 链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 2 个节点是值为 4 的节点。示例给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.解题思路我是首先把链表里有多少个元素求了出来为n,然后计数器i >= n - k前面的元素都不用,后面的元素就是我们
2021-02-01 22:22:06
123
原创 旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例输入:[3,4,5,1,2]输出:1输入:[2,2,2,0,1]输出:0解题思路经典的二分查找。(当然可以排好序在返回第一个数字,但是这么做时间复杂度为O(n^2))。mid < high,说明最小值在左半部分。如果mid > high,那么
2021-01-30 21:13:29
67
原创 斐波那契数列
题目描述写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例输入:n = 2输出:1输入:n = 5输出:5提示0 &
2021-01-30 16:42:04
205
原创 剑指Offer之替换空格
替换空格题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”限制:0 <= s 的长度 <= 10000解题思路创建新的字符串,遍历所给的字符串s如果遇到空格就在新建的字符串中加‘%20’,如果不是空格就照抄。代码示范class Solution {public: string replaceSpace(string s) { stri
2021-01-26 21:00:28
93
原创 Unity即时模式GUI
“即时模式”GUI(又称IMGUI)是一个完全独立的功能系统,需在实现脚本上调用OnGUI()函数。只要在控制脚本激活的状态下,OnGUI()函数会在每帧调用,就像Update()函数一样。例如,以下代码:void OnGUI() { if (GUILayout.Button("Press Me")) Debug.Log("Hello!"); }结果如下:即时模式GUI常用于:创建游戏内调试显示和工具。为脚本组件创建自定
2020-10-29 20:52:38
286
原创 构造函数和析构函数
构造函数在C++类中定义与类名相同的成员函数叫做构造函数;构造函数可以带参也可以无参,而且该函数没有返回类型;在一般情况下运行程序时编译器会自动调用构造函数,特殊情况下需要人工调用。下面是类中的无参构造函数:class Test {public: Test() { ... }}带参构造函数:class Test {private: int num;public: Test(int i) { this->num = i; }}拷贝构造函数拷贝构造函数是一种
2020-10-29 11:01:23
305
原创 堆和栈
栈和栈栈(stack)是一种“先进后出”的存储结构,类似于手枪弹匣。类型有:静态栈和动态栈两种。静态栈由数组实现,动态栈由连标实现。堆(heap)是一个用来查询最大值与最小值的二叉树。添加/删除的复杂度是O(logn),查找的复杂度是O(1)。堆与栈的区别首先说栈栈(stack)的分配和释放都由编译器自动执行的。通常存放局部变量,函数参数等。堆(heap)是人工分配和释放的,这样做的最大缺陷就在于容易出现内存泄漏的情况。堆在内存中内存地址是由低到高的,栈是由高到低的。空间大小的不同在每个
2020-10-26 17:00:43
124
原创 指针与引用
说起指针和引用的区别之前得先了解指针是什么?引用又是什么?指针在C/C++中指针是指数据在内存单元中的地址。例如有一个变量char a存储在’0x1F’中,若另有一个指针p的值为’0x1F’。那么p就是指向a的指针。char a = 'A';char *p = &a;#mermaid-svg-lNJb4riOBguDYWnj .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-f
2020-10-09 16:24:32
72
原创 const和define的区别
#define和const区别看完网上资料后个人理解如下:首先在编译的预处理时**#define就会被处理,而const**在编译、运行时才被处理。#define没有数据类型的检查,只是一种字符的替换。而const有数据类型的检查,这样就可以避免一些错误的发生。#difine不会为宏定义的常量开辟内存空间。而const会给定义的常量开辟内存来存储且不能改变其值。代码调试时**#define是不能被调试的,因为它在预处理是就已经替换其值。而const**常量是可以进行调试的。综上所述,一般编程
2020-10-08 22:14:53
83
原创 TinyHttpd开源项目的阅读笔记
TinyHttpd开源项目的阅读笔记什么是TinyHttpd?程序流程从main()函数开始startup()accept_requestexecute_cgi运行这是本人刚开始精读开源项目,若有理解错误的或者说的不对的还望大家指点,一起进步,谢谢大家的支持。TinyHttpd源码地址下载好源码后就开始阅读了。什么是TinyHttpd?tinyhttpd 是一个超轻量型 Http Server,使用C语言开发,全部代码只有500多行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解
2020-10-06 13:44:34
211
原创 DS单链表—删除重复元素
DS单链表—删除重复元素题目描述给定n个整数,按输入顺序建立单链表,删除其中的重复数字,输出结果链表。(要求不可以构建新结点,不可以定义新链表。在原链表上删除。)输入测试次数t每组测试数据一行:n(表示有n个整数),后跟n个数字输出对每组测试数据,输出删除重复数字后的结果链表表长和每个元素,具体格式见样例。样例输入310 1 2 3 4 1 2 10 20 30 205 1...
2019-12-17 22:42:22
1752
1
原创 从零到一
怎么了朋友们你们好,这里是猿其实也很帅,感谢你的阅读和关注。哈哈哈,其实这是我第一次写博客,刚刚看了一下自己在593天前就已经注册账号了,但在这漫长的593天里,说句实话我始终没有怎么关注过这里的博客以及我在读专业的一些新知识。为什么呢?最近我想了一想最后觉得自己对此专业的理解还是比较浅薄。再加上外在因素更让我怀疑了我当时的选择:软件工程。记得我当时兴高采烈,蹦蹦跳跳的踏入大学校门时,受到了很多...
2019-11-19 21:50:12
270
原创 DS静态查找之顺序查找
题目描述给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始要求使用带哨兵的顺序查找算法输入第一行输入n,表示队列有n个数据第二行输入n个数据,都是正整数,用空格隔开第三行输入t,表示有t个要查找的数值第四行起,输入t个数值,输入t行输出每行输出一个要查找的数值在队列的位置,如果查找不成功,输出字符串error样例输入833 66 22 88 11 27 4...
2019-11-19 17:01:31
1591
原创 DS查找——折半查找求平方根
#include #include #include using namespace std;int main(){int n;double y;cin >> n;for (int i = 0; i < n; i++){cin >> y;double low = 0double high = y,mid = y/2;while(abs(mi...
2019-11-19 16:46:33
716
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人