自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 问答 (1)
  • 收藏
  • 关注

原创 2020-12-17

考研题型里有一个题型叫做名词解释,这道题或多或少的咋试卷中占着一定的分量,但是分数又不是太多,用大量的大块时间来搞这个有点不太值当,所以抽些时间做个总结文档,用于空闲时间查看。本文中概念不全,仅总结了个人易混淆及常考的概念。名词解释数据:是对客观事物的符号表示。数据元素:是数据的基本单位,也称节点(node)或记录(record)。数据对象:是性质相同的数据元素的集合,是数据的一个子集。数据项:有独立含义的数据最小单位,也称域(field)。数据结构:是相互之间存在一种或多种特定关系的数据元素

2020-12-17 17:56:36 120

转载 Const成员函数的异常安全性

如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方便。在这个类中,如果有一个函数能计算多选式的根(也就是,多项式等于0时,各个未知量的值)将变得很方便。这个函数不会改变多项式,所以很自然就想到把它声明为const:class Polynomial{public: using RootsType = //一个存放多项式的根的数据结构 ...

2019-12-03 16:59:51 239

原创 多线程读操作的异常安全性

最近在写一个项目,程序偶现一个“double free” 问题,经过排查发现在实际运行情况中会有多个线程调用一个loadString操作,而原本loadString只是一个读操作,而多线程共同读同一个资源信息按理说应该是不会有同步问题出现的,但是通过GDB调试发现程序的崩溃处在switchLanguage的一个赋值操作。然后我走进switchLanguage中发现那个崩溃的赋值...

2019-12-03 16:46:49 277

原创 C++ const成员函数中成员的隐含类型

最近在写项目遇到一个之前忽略的有关const 成员函数的特性:class sample{public: sample(int* p) : _p (p) {}private: int* _p;};class Test {public: void getA() const { sample s(&a); }private: int a; int b;...

2019-12-03 11:03:32 252

原创 TCP并不总是“可靠”的?

1. 当对方意外崩溃后(如断电或网络中断),并且没有发出FIN包时,处于发送端无法得知这种情况,处于发送缓冲区的数据会不断向对方发送,但由于对方离开会不断因为超时重传,重传12次左右 大概9分钟 依然没有响应就会返回一个超时通知如果发送端此时有一个read操作会读取到这个信号,但如果在之后你继续通过这个套接字进行写数据的话,会触发SIGPIPE 信号 如果不对信号进行处理 程序将直接退出。...

2019-09-12 14:55:07 231 1

原创 对于TimeWait状态的新理解

进入TimeWait状态的以放会停留在这个状态2MSL的时间。MSL:任何IP数据包可以停留在互联网中最长的时间ip包头有一个TTL(最大为255)的字段代表了最多可跳的节点数也就是路由器节点。最终的限制则我们假设为:在不超过MSL的时间范围内 255为最多跳的路由器节点数。之前的理解:1.主动关闭方进入timewait状态2.timewait状态有2MSL的持续时间3.timew...

2019-08-15 10:24:31 330

转载 硬链接与符号链接的区别

https://www.jianshu.com/p/9163276dca55

2019-05-18 10:48:43 3800

转载 头文件中定义函数引发的multiple definition

http://jiadebin.github.io/2017/04/03/%E5%A4%B4%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%E5%BC%95%E5%8F%91%E7%9A%84multiple-definition/

2019-04-25 13:20:31 600

转载 系统调用与标准I/O库的区别

https://blog.csdn.net/qq_33366098/article/details/77923722

2019-04-24 11:28:25 331

转载 硬件中断与软件中断区别

中断 中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。硬件中断 硬件中断是一个异步信号, 表明需要注意, 或需要改变在执行一个同步事件.硬件中断是由与系统相连的外设(比如网卡 硬盘 键盘等)自动产生的...

2019-04-16 08:51:25 6313 4

转载 避免使用vector<bool>

https://www.cnblogs.com/yfceshi/p/6869533.html作为一个STL容器,vector&lt;bool&gt;仅仅有两点不正确。首先。它不是一个STL容器。其次,它并不存储bool。除此之外。一切正常。 一个对象要成为容器,就必须满足C++标准中列出的全部条件。当中一个条件是,假设c是包括对象T的容器,并且c支持operator[],那么以...

2019-01-08 13:16:30 209

原创 为什么new一个数组一定要搭配delete []?

    今天在学习了侯捷老师的《C++面向对象高级编程》的课程,对于一个之前感兴趣的点有了新的认识,下面来进行总结一下:      我们知道当我们申请一个数组时我们会采用 new  classname[3]这种形式,在很多编程技巧书上会强调当你使用new []就应该搭配delete[]使用,如果你对一个指向数组的指针进行delete的话,行为未定义。那么究竟是为什么呢?很简单可以想到的是当我们...

2019-01-05 17:10:15 1833

原创 《深入探索C++对象模型》读后笔记

今天阅读完了《深入探索C++对象模型》对许多问题有了更深的理解,下面进行总结一下:   1.关于C++的对象布局  答:① 当没有继承情况出现时,类的大小以及排列可以理解为按顺序排列,对象与对象之间存在着alignment,也就是字节填充可以使得对象大小为数据类型的整数倍(关于结构体大小的研究可以参考https://blog.csdn.net/jueduiwudi6/article/det...

2019-01-04 15:04:20 250

原创 关于C++ 的operator new、 operator new[]、operator delete、operator delete[]、placement new、placement delete

1.operator new 与 new operator的区别答:我们经常会使用new来动态分配一个对象,而使用的new就是new运算符。那么new一个对象后面会发生什么事呢?     ① 调用operator new函数申请一段内存(大小刚好就是你要new的那个对象的大小,那个大小会作为参数传给函数,如果是operator new[]则是所有对象总共的大小)     ② 然后编译器...

2019-01-03 19:46:37 659

原创 只能在堆上或只能在栈上创建的类

 本文上半段借鉴了http://www.cnblogs.com/sopc-mc/archive/2011/11/03/2235124.html1. 只能在堆(heap)上创建对象/禁止产生栈(stack)对象       创建栈对象时会移动栈顶指针以“挪出”适当大小的空间, 再在这个空间上直接调用对应的构造函数以形成一个栈对象, 而当函数返回时会调用其析构函数释放这个对象, 再调整栈顶指针...

2019-01-02 20:27:31 397

转载 动态链接和静态链接的区别

动态链接和静态链接的区别动态链接和静态链接的区别https://www.cnblogs.com/njczy2010/p/5793477.html一、分别编译与链接(Linking)大多数高级语言都支持分别编译,程序员可以显式地把程序划分为独立的模块或文件,然后每个独立部分分别编译。在编译之后,由链接器把这些独立的片段(称为编译单元)“粘接到一起”。(想想这样做有什么好处?)在C...

2018-12-16 21:16:44 3343 1

原创 内存碎片的由来

     经常看别人博客说到“内存碎片”这个概念,而且很多编程技巧书也经常提到频繁地调用内存分配函数会导致越来越多的内存碎片产生,降低内存的利用率。那么这个“内存碎片”究竟是怎么产生的呢?答案可能要从“操作系统”中查找了。    在翻阅了一些《操作系统》的书之后,对于这个概念有了更清晰的理解,下面进行总结:       当我们运行一个程序时,处理器要生成一个进程,并把程序载入内存。那么内存...

2018-12-16 21:06:06 185

转载 如何让UDP实现可靠传输

作者:萌小宏 来源:CSDN 原文:https://blog.csdn.net/best_fiends_zxh/article/details/53558829   自定义通讯协议,在应用层定义一些可靠的协议,比如检测包的顺序,重复包等问题,如果没有收到对方的ACK,重新发包UDP没有Delievery Garuantee,也没有顺序保证,所以如果你要求你的数据发送与接受既要高效...

2018-12-15 16:14:14 159

原创 计算机网络学习-应用层笔记

1.对于许多即时讯息应用而言,采用的是混合体系结构。服务器主要用来跟踪用户之间的IP地址,但用户与用户之间的报文不经过服务器,而是由一个用户直接发给另一个用户。(猜想QQ就是这样实现通信的)2.具有吞吐量要求的应用程序被称为带宽敏感的应用。比如现在大多数多媒体应用(视频播放这类应用要求具有一定的吞吐量才能拥有良好的画质与播放效果),而弹性应用能根据情况或多少少地利用可供使用的吞吐量。电子邮件,...

2018-12-14 18:17:55 448

转载 AVL树与红黑树的比较

作者:執著我們的執著链接:https://www.jianshu.com/p/37436ed14cc6來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。RB-Tree和AVL树作为BBST,其实现的算法时间复杂度相同,AVL作为最先提出的BBST,貌似RB-tree实现的功能都可以用AVL树是代替,那么为什么还需要引入RB-Tree呢?红黑树不追求"完全平...

2018-12-10 13:54:02 1055

原创 二叉树算法题总结

1.二叉树的节点数计算class CountNodes {public: int count(TreeNode* root) { if (!root) return 0; int size = 1 +count(root-&gt;left); size += count(root-&gt;right); return size; }};2.二...

2018-12-09 20:07:21 851

转载 哈希表与二叉排序树的比较

此段来自《极客时间》王争老师的数据结构与算法:我们在散列表那节中讲过,散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。而二叉查找树在比较平衡的情况下,插入、删除、查找操作时间复杂度才是 O(logn),相对散列表,好像并没有什么优势,那我们为什么还要用二叉查找树呢?我认为有下面几个原因:第一,散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。...

2018-12-07 14:20:58 1568

原创 算法第十二记 二叉排序树总结

今天在看完了《算法导论》的二叉排序树和极客时间王争老师讲的二叉排序树有了不少体会,下面进行总结一下:   自己在阅读完书籍后,立马自己手写了一遍二叉排序树:#pragma oncestruct TreeNode { TreeNode(int val) :value(val),left_child(nullptr), right_child(nullptr),parent(nullp...

2018-12-07 14:01:43 326

转载 算法第十一记-哈希算法总结

     今天我在看极客时间的网课时重新认识了“哈希算法”这个概念,之前一直与前一节的哈希函数搞混了。其实哈希算法的作用非常广泛,哈希函数只是其中的一个应用:     首先我们来重新认识一下“哈希算法”到底是什么?它的定义和原理很简单,基本上一句话就可以概括。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。而通过原始数据映射之后得到的二进制串就是哈希值。仔细想一想...

2018-12-05 19:20:48 231

原创 散列表知识点总结

最近在复习数据结构以及在上极客时间的网课,对散列表的只是进行部分总结:1.当使用散列表进行存储元素时,主要使用散列函数对键值进行计算得到存储位置。基于“鸽巢原理”,我们不可避免地必须处理冲突的问题,解决冲突的方法一般有两种:     ① 链表法:每个槽对应一条链表,当散列函数计算后会进入某个槽,每个槽有一个指向链表的头指针,所以插入链表时直接插入头部就行,因此插入的效率是O(1)。查找一个...

2018-12-05 17:11:02 976

转载 栈相关算法题总结

1定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的分函数(时间复杂度应为O(1))。答:这个问题首先需要建立两个栈,一个数据栈,另一个栈用来存储最小值.stackMin,stackData。  ①第一种方法    入栈:当stackMin栈为空或者值&lt;stackMin.top()时,值入stackMin栈如果值大于stackMin的栈顶,则将stackMin的栈顶...

2018-12-02 20:24:27 1109

原创 深度探索C++对象模型 第二章读书笔记

1.如果设计者提供多个constructors,但其中都没有default constructor呢?编译器会扩张现在的每一次constructors,将“用以调用所有必要之default constructor”的程序代码加进去。它不会合成一个新的default constructor,因为其他由user所提供的constructors存在的缘故。如果同时亦存在着“带有default const...

2018-11-30 14:55:15 134

原创 链表相关算法题总结

1.环形链表插值有一个整数val,如何在节点值有序的环形链表中插入一个节点值为val的节点,并且保证这个环形单链表依然有序。给定链表的信息,及元素的值A及对应的nxt指向的元素编号同时给定val,请构造出这个环形链表,并插入该值。测试样例:[1,3,4,5,7],[1,2,3,4,0],2返回:{1,2,3,4,5,7} ListNode* insert(vector...

2018-11-29 17:05:58 665

原创 设计模式学习笔记②-观察者模式

观察者模式定义:观察者模式定义了对象之间的一对多依赖,这样一来当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。    假如我们有一个报社,和一些客户。我是其中的一个客户,报社每当一有报纸要出版就会给所有订阅过报纸的客户进行送报。客户如果取消订报服务的话,报社就会将客户从订阅名单中删除,之后这个客户就不会再收到报纸了。松耦合的威力  当两个对象之间松耦合,它们依然可以...

2018-11-27 21:26:46 130

原创 深度探索C++对象模型 第三章读书笔记

今天阅读了《深度探索C++对象模型》的第三章,对于C++编译器所做的事又了解了不少,下面来总结一下:        1. 对于一个空类它的大小并不是直观上的0,因为假设定义了一个对象如果它的大小是0的话,那么它返回的地址就无法使用。所以编译器会为它添加一个byte,用来标识两个对象独一无二的地址。一个派生类继承这个空类的话,有些编译器会针对empty virtual base class进...

2018-11-27 14:15:41 126

原创 算法第九记-线性排序

我们已经知道很多高效率的排序,归并排序、快速排序、堆排序。它们都是O(nlogn)级别的。事实上还存在更高效率的排序算法,但是它采取了“拿空间换取时间”,这三种排序算法分别是:①计数排序 ②基数排序 ③ 桶排序 下面我们来分析一下他们的原理以及效率。计数排序 计数排序的基本思想是:对于每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了。例如,如...

2018-11-26 16:57:42 125

原创 设计模式学习笔记①-策略模式

今天我看《Head First 设计模式》学到了第一个设计模式-策略模式,写篇博客来总结一下:策略模式的定义和使用场景定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话...

2018-11-24 22:00:08 78

原创 算法第八记-堆排序

今天来总结一下堆排序的思路以及使用到堆排序思路的算法面试题:首先堆是一棵完全二叉树,它的左子树与右子树同时也都是堆(至于是最大堆还是最小堆。随便),如果你的堆是最大堆的话,那么它的性质每个结点都大于其左右孩子结点的值。如果是最小堆的话,每个结点都小于其左右孩子结点的值。而且对于堆来说每次删除操作都是在堆顶操作的。而插入操作则没有这个限制。我们一般是用数组来存储数据(树的存储形式可以是数组),然后通...

2018-11-24 11:33:29 515

转载 建堆的效率分析

部分转载自https://blog.csdn.net/wangqing_199054/article/details/20461877和https://www.cnblogs.com/shytong/p/5364470.html现在常有两种建堆的方法,而这两种方法又有着不同的时间复杂度。下面分别陈述:(1)自顶向下的建堆方式这种建堆的方法具有O(n*log2n)的时间复杂度。从根结点开...

2018-11-24 11:32:47 1156

转载 排序的稳定性

https://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html  稳定排序和不稳定排序      这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应...

2018-11-24 10:54:35 70

原创 算法第七记-快速排序

今天来记录一下快速排序的思路,效率分析,以及相关的面试算法题:快速排序与前面讲过的归并排序有着一部分相同的思想,基于分治+ partion操作。这个组成和归并排序很像,我们之前讲过归并=分治+合并。所以讲快排时我们同样先讲这个partion操作:基本思路:假设我们取序列第一个元素为划分基准,我们定义一个边界控制边界左边的值都是小于这个基准元素,右边都是大于这个基准元素然后我们定义一个指针从...

2018-11-22 18:24:20 208

原创 算法第六记-二分查找

为了准备春招,自己重新总结了一下二分查找的各种形式,以及几个二分查找的面试题:1.普通的二分查找int binary_find(int arr[], int length,int value)//普通的二分查找{ if(!arr||length&lt;=0) return -1; int low = 0, high = length - 1; while (low...

2018-11-20 14:22:21 162 1

原创 算法第五记-归并排序

      今天我要讲的排序算法是归并排序,首先我想提出一个问题(很多算法题的思路都源于此),给定两个已排序的序列,如何将其两个序列合并为一个大序列并且依然保持有序。思路很简单每个小序列维持一个指针指向左边界,然后两个序列的左边界进行比较大小,小的那方加入新的序列中,同时小的那方左边界右移一个位置。以此类推,如果有一方序列已经到达尾部,则直接将另一方的序列直接放入新序列的尾部。序列1:1,3,...

2018-11-18 14:20:30 154

转载 算法第四记-希尔排序

作者: dreamcatcher-cx出处: &lt;http://www.cnblogs.com/chengxiao/&gt;本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接。 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为...

2018-11-17 10:33:52 146

原创 算法第三记-插入排序

     今天我们要讲的是插入排序,对于插入排序的思路我们可以拿我们平时打扑克整理牌的思路来讲,当我们拿到一张牌我们先随意放在左边,然后又抽到一张牌,那么这张牌应该放在哪里呢?一般来说我们会跟已经整理好的牌序列最右边的那张比较比较,如果比它小,我们就需要将牌插入到它的左边,然后继续不断比较,直到遇到比待插入牌小的位置,然后我们插入到它的后面。这样解释或许有点牵强,因为有时候我们打牌不只是会去凑顺子...

2018-11-16 13:06:48 121

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除