自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 收藏
  • 关注

原创 单链表面试题汇总

之前我们实现过单链表的一些简单接口,而单链表还有一些面试题非常重要,今天来看一下一些常见面试题的实现 (注:本文调用的简单接口实现:http://blog.csdn.net/qq_34021920/article/details/76594389)1.从尾到头打印单链表void RPrintList(pList plist);//从尾到头打印链表(不改变链表)从尾到头打印单链表,...

2017-08-03 18:28:08 2645 18

原创 Python列表

列表是又一系列按特定顺序排列的元素组成。在Python中,用方括号[ ]来表示列表,并用逗号来分隔其中的元素。访问列表元素告诉Python你要访问元素的下标就可以访问列表中的元素bicycle = ['trek','cannondale',’redline’,’specialized’]print (bicycle[0])'trek'注:当下标为-1时,表示访问列表的最后一个元素...

2019-01-23 17:12:31 278

原创 设计一个类不能被继承、设计一个类只能在堆上创建实例,设计一个类只能在栈上创建实例

设计一个类不能被继承、设计一个类只能在堆上创建实例,设计一个类只能在栈上创建实例方式一:把构造函数声明为私有函数(该方法创建的类只能在堆上创建实例)在C#中有关键字sealed,在Java中有关键字final它们修饰的类不能被继承 在C++中我们知道,子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数,所以我们可以把父类的构造函数和析构函数定义为私有函数 ...

2018-09-04 11:39:47 332

原创 gdb调试

要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g选项gdb常用命令:list/l + 行号:显示源代码,接着上次的位置往下列每次10行list/l + 函数名:显示某个函数的源代码r/run:运行程序n/next:单条执行,相当于VS的F10s/step:进入函数调试,相当于VS的F11break/b + 行号:在该行设置断点break + 函数名:在某个函数...

2018-09-02 12:48:28 366

原创 vim常用命令总结

vim有多种模式,但是常用的就是三种模式:命令模式、插入模式、末行模式(还有可视模式) 命令模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入插入模式下,或者到末行模式下。 插入模式:只有在插入模式下,才可以做文字输入,按ESC键可回到命令行模式。 末行模式:文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。在命令模式下,shift+冒号,即可进入该模式。在低行模...

2018-08-21 16:58:39 236

原创 Linux中的内存分配

不同的语言规定的内存分配是不一样的。 “段”是对一个完整的程序而言,也就是从操作系统的角度看 “区”则是对整个内存而言对于一个程序而言:栈:存放局部变量堆:动态开辟的变量,new malloc开辟出的数据段,也就是全局区/静态区 —— 又可以分为已初始化BSS段和未初始化DATA段,注意的是bss段不给该段的数据分配空间,只是记录数据所需空间的大小只读数据区—-存放字...

2018-08-21 16:47:43 276

原创 网络-----TCP的可靠性保证相关机制

在之前,我们已经初步接触了TCP协议TCP是传输层的协议它的主要特点有:TCP是面向连接的(TCP的三次握手和四次挥手)TCP面向字节流TCP带缓冲的(不会立即发送,会等到一个合适的时机再发,因为有可能来不及应答)TCP是全双工的TCP保证了可靠传输TCP具有流量控制今天我们主要谈一下TCP是如何保证可靠性的确认应答机制TCP的确认应答机制就是,发送端给接...

2018-08-15 23:43:12 1365

原创 Effective C++读书笔记四(设计与声明)

条款18:让接口容易被正确使用,不易被误用如果客户企图使用某个接口而却没有获得他所预期的行为,那么这个代码就不该通过编译;如果代码通过了编译,它的所作所为就应该是客户想要的。 要是想开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户有可能做出什么样的错误。来看个例子:class Date{public: Date(int month, int day, in...

2018-08-14 15:32:04 173

原创 Effective C++读书笔记三(资源管理)

所谓资源就是,一旦你用了它将来必须还给系统。 C++程序中最常使用的资源就是动态分配内存,但内存只是你必须管理的众多资源之一。例如:文件描述符、互斥锁、图形界面中的字型和笔刷、数据库连接及网络socket。不论是哪一种资源,当你不再使用它的时候,必须将它还给系统。条款13:以对象管理资源先来看个例子:class Investment {...}; //继承体系中的root...

2018-08-11 09:58:46 207

原创 Effective C++读书笔记二(构造 / 析构 / 赋值运算)

条款05:了解C++默默编写并调用了哪些函数class Empty{};上面这个类是一个 空类,但是经过C++处理之后,它就不再是一个空类了。如果你自己没有生命,编译器就会为它声明一个构造函数、拷贝构造函数、赋值运算符重载和析构函数,所有这些函数都是public而且inline的。其实上面的类就会变成下面这个样子class Empty{public: Empty(){...

2018-08-09 23:07:55 189

原创 Effective C++读书笔记一(让自己习惯C++)

条款01:视C++为一个语言联邦最初的C++只是C加上一些面型对象特性,就像C++最初的名字“C with Classes”。但是现在C++已经是一个多重泛型编程语言。为了理解C++我们必须认识其主要的次语言1、CC++仍然是以C为基础,区块、语句、预处理器、内置数据类型、数组、指针等通通来自于C2、Object-Oriented C++这部分也就是C with Cla...

2018-08-08 23:22:57 157

转载 C++11中值得关注的几大变化(详解)

源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里。所以,我就不翻译了,我在这里仅对文中提到的这些变化“追问为什么要引入这...

2018-08-06 10:01:38 460

原创 C/C++动态内存管理

在C语言中,如果我=我们需要动态开辟一块空间,会用到下面这几个函数:malloc:void* malloc(size_t size); malloc函数是在内存中开辟一段连续的空间,开辟的大小为size个字节。开辟成功之后会返回这块空间的首地址calloc:void* calloc(size_t num, size_t size);calloc和malloc...

2018-08-05 13:39:51 191

原创 C++----浅析智能指针

背景到目前为止,我们编写的程序中所使用的对象都有着严格定义的生命周期。全局对象在程序启动时分配,在程序结束时销毁。对于局部自动变量,当我们进入其定义所在的程序块时被创建,在离开块的时候销毁。局部static对象在第一次使用前分配,在程序结束时销毁。 除了自动和static对象外,C++还支持动态内存分配。动态分配的对象的生命周期与它们在何处创建是无关的,只有它们被显示释放时,这些对象才会销毁...

2018-08-05 12:22:42 209

原创 C++-----不能声明为虚函数的函数和建议声明为虚函数的函数

不能声明为虚函数的函数1. 普通函数普通函数不是类的成员函数,所以只能被重载而不能被重写,声明为虚函数也没有任何的意义。而且编译器会在编译时绑定函数,但动态多态体现在运行时绑定。2. 静态成员函数首先静态成员函数不属于任何类对象或类实例,它是所以类对象共享的,所以静态函数变为虚函数没有意义。 其次静态函数中没有this指针,而虚函数依靠虚表指针和虚表来调用,虚表指针在类的构造函数...

2018-08-03 17:46:47 280

原创 C语言-----模拟实现内存操作函数(memset、memcpy、memmove、memcmp、memchr)

之前实现过一些字符串操作函数,在C标准库中还有一些操作内存的函数1、 memset这个函数是用来设置内存内容的,平时我们可以利用它来初始化一段连续空间。 要注意的是这个函数的后两个参数,第二个参数是int,但是具体使用的时候用的是char类型,第三个参数是你要设置内存的大小,以字节为单位。void* my_memset(void* buf, int value, size_t n...

2018-07-30 18:05:41 554

原创 面试题-----大数相乘问题

在计算机中存储数据的大小是有限的,当我们需要表示一个很大的数的时候应该很自然就能想到用字符串。字符串相乘问题在笔试面试中也比较常见,直接上思想:我们可以借助于可动态调整大小的数据结构(vector,string,deque)模拟实现数字的乘法操作。对于普通的乘法,我们知道m位数和n位数相乘,最后的结果位数在区间[m+n-1,m+n]内。 举个例子:25*23 就是标准的手动乘法运算,只...

2018-07-16 21:29:26 607

转载 C语言-----全局变量、局部变量、静态全局变量、静态局部变量的区别和联系

转自:全局变量、局部变量、静态全局变量、静态局部变量的区别C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。从作用域看:全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然...

2018-07-14 23:41:26 1486

原创 Linux-----浅析grep工具及正则表达式

grep工具是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep的语法: 在使用grep的时候需要注意以下几点:grep不加引号直接过滤字符串grep在进行模式匹配的时候必须加引号,单引和双引号都可以grep在引用变量的时候必须加双引号来看看grep的选项:-a:不要忽略二进制数据-A #:除了显示符合条件的那一行之外,还显示该行之...

2018-07-08 21:49:10 295

原创 shell脚本-----命令代换

什么是命令代换命令代换简单来说就是在shell内部嵌套多条命令,一次执行得到结果shell的命令代换有两种方式可以实现:` `:反引号$( ):美元符号加圆括号来看例子: 既然这两种方式都可以进行命令代换,那么它们有什么区别呢?$( )支持命令嵌套使用,而反引号是不行的 这条命令虽然没有什么意义,但是很好的说明了$( )是支持嵌套使用的反引号比较陈...

2018-07-07 18:03:59 257

原创 shell脚本----shell的字符串截取

在这里总结一下shell脚本的字符串截取方式以字符串 str=”1:2:3:4:abcd” 为例1. # 截取,删除左边字符,保留右边字符#!/bin/bashstr="1:2:3:4abcd"echo ${str#*:}str为要截取的字符串,#为运算符,*:表示从左边开始删除第一个:及它左边的所有内容 所以结果如下: 2. # # 截取,删除左边字符,保留右边字...

2018-07-07 00:38:17 7928

原创 shell脚本----shell基本语法及实现一个简单的进度条

Shell 脚本,是一种为 shell 编写的脚本程序。shell编程和java、Python、PHP编程类似,只要有一个可以编写代码的文本编辑器和一个可以解释并执行代码的解释器就可以了。 来看个简单的shell脚本:...

2018-07-06 23:38:12 1659

原创 网络-----Linux下常见网络命令总结

主要说明Linux环境下命令的使用ping命令1、原理ping 命令是用来测试TCP/IP 网络是否畅通或者测试网络连接速度的命令,对确定网络是否正确连接,以及网络连接的状况十分有用。简单的说,ping就是一个测试程序,如果ping运行正确,大体上就可以排除网络访问层、网卡、Modem的输入输出线路、电缆和路由器等存在的故障,从而缩小问题的范围。 ping命令的原理是根据计算...

2018-06-06 12:39:02 24805 1

转载 网络-----Linux下和Windows下ping命令的区别

Ping 是Windows自带的一个DOS命令。利用它可以检查网络是否能够连通,用好它可以很好地帮助我们分析判定网络故障。该命令可以加许多参数使用,键入Ping按回车即可看到详细说明。Ping 命令可以用来验证与远程计算机的连接。  ping的参数  ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count]...

2018-06-01 22:01:58 3863

原创 STL-----浅析二级空间配置器

在之前我们已经简单介绍过STL中的一级空间配置器,并且进行了模拟实现 但是来看下面这个问题: 如图,阴影部分是我们开辟的不连续的小的内存块,空白区域是空闲的,如果现在要申请一段三个块大小的连续空间,可以申请出来吗?显然不能。但我们会发现系统剩余的内存明明足够我们需要的空间大小,可开辟太多了不连续的小块空间,导致没有办法开辟出来大块的内存,这就是内存碎片的问题。 STL中的二级空间配置器...

2018-05-26 18:05:59 825 9

原创 网络-----TCP报头中的选项字段

选自《Linux高性能服务器编程》3.2.2TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。典型的TCP头部选项结构如图所示。 选项的第一个字段kind说明选项的类型 有的TCP选项没有后面两个字段,仅包含1字节的kind字段第二个字段length(如果有的话)指...

2018-05-20 12:07:53 11365 2

原创 网络-----浅谈TCP的三次握手和四次挥手

TCP三次握手TCP连接建立的过程被称为三次握手,先来看看三次握手的过程,上张图 1、客户端向服务器发出连接请求报文段,这时TCP报文段首部的同步标志位 SYN=1 ,同时选择一个初始序号 seq=x(图中seq=123)。TCP规定,SYN报文段不能携带数据但要消耗掉一个序号。这时客户端进入SYN_SENT状态——第一次握手2、服务器收到连接请求报文段之后若同意建立连接,就向客户...

2018-05-20 10:55:13 382

原创 网络-----浅析IP数据报格式及TCP/UDP报文段首部格式

IP数据报的格式先来上张图在解释: 来看看每个字段的具体含义:(只讨论IPV4的情况)1、版本 占4位,指IP协议的版本。通信双方使用IP协议的版本必须一致。例:使用IPV4即填42、首部长度 占4位,顾名思义,这个字段就是标识了IP数据报的首部长度。该字段以4字节为单位,可以表示的最大的数是”1111”,也就是十进制数15,所以IP首部长度最大为60字节(15*4=60)。...

2018-05-18 20:52:21 5740 2

原创 STL-----模拟实现一级空间配置器

众所周知,STL中有六大组件:容器容器适配器仿函数迭代器算法空间配置器在之前的学习中前面五种我们都已经接触过了,但是在学习其他组件的过程中,我们会发现一个东西隐藏在了一切组件的背后,它就是空间配置器以STL的实现角度而言,空间配置器是第一个就需要介绍的组件。因为整个STL的操作对象都存放在容器之内,而容器一定需要配置空间来存放数据的。在我们平时写程序时,需要开辟空间可...

2018-05-11 22:30:25 321

原创 网络-----多进程及多线程版本的TCP网络程序

之前我们已经利用socket编程实现了一个单进程的TCP网络程序(https://blog.csdn.net/qq_34021920/article/details/80153071) 我们再开启一个终端去连接服务器端,可以发现的是第二个客户端不能和服务器正常通信了,除非我们第一个客户端退出之后,第二个客户端才能和服务器正常通信。可以注意到大部分的socket接口都是阻塞型的。实际上除非特别指定...

2018-05-06 21:37:30 257

原创 网络------简介OSI及TCP/IP参考模型

OSI七层网络模型称为开放式系统互联参考模型,是计算机网路体系结构发展的产物,它是一个逻辑上的定义和规范,把网络从逻辑上分为了7层.。 来看一张图: 这七层每一层都有相关、相对应的物理设备,比如路由器、交换机等。来从下到上来介绍一下这七层:物理层物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础,物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠...

2018-05-06 10:32:49 335

原创 网络------利用socket编程实现简单的UDP网络程序

之前已经介绍过socket编程了,并且实现了一个简单TCP网络程序 https://blog.csdn.net/qq_34021920/article/details/80153071 现在再来实现一个简单的UDP程序,来看看需要用到的操作注:UDP同样需要利用socket函数创建套接字,然后利用bind函数进行绑定。在这里就不再做详细介绍(链接戳上面),在这里介绍一下UDP进行数据读...

2018-05-05 13:54:14 559

原创 网络------利用socket编程实现简单的TCP网络程序

什么是socket之前我们在谈论进程间通信的时候,说到过一种实现进程间通信的机制,就是socket套接字,那么socket到底是什么呢? 来看看百度百科的解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对socket。socket本质是编程接口(API)在网络中我们利用IP地址+端口号来表示网络中的唯一一个进程,...

2018-05-05 13:51:15 806

原创 C++-----重载、重写与隐藏

之前在学习C++继承和多态的时候对于三个概念理解的不是很透彻,现在对这三个的概念来总结一下重载 overload重载:简单说就是函数名称相同,但是参数列表不相同的情形,这样的同名不同参数的函数互相称之为重载函数。 重载实际上属于多态的一种,是编译时多态即静态多态 来看看重载的条件相同的范围(成员函数重载)函数名相同参数列表不同在这里解释一下参数列表不同可以是以下几种...

2018-05-03 18:11:08 178

原创 C++------浅拷贝、深拷贝和写时拷贝

浅拷贝先来看一个例子:class String {public: String(const char * pData = "") :_pData(new char[strlen(pData) + 1]) { strcpy(_pData, pData); } ~String() ...

2018-04-28 22:23:21 609

原创 数据结构------并查集

先来看一道题: 假设一组有n个人和m对好友关系(存于数组r)。如果两个人是直接或者间接好友(好友的好友就是间接好友),则认为他们属于同一个朋友圈,请写出程序求出这个n个人里面一共有多少个朋友圈。 例如:n = 5,m = 3,r = {{1,2},{2,3},{4,5}} 表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于一个朋友圈.。则一共拥有...

2018-04-25 20:27:06 398

原创 Linux-----进程间关系和守护进程

在学习完进程之后,我们再来谈谈进程间关系 一个正在运行的程序(即进程)有着许多属性,经常用于进程控制的有:实际用户id,有效用户id,设置用户id、组id、进程id、进程组id、会话id。 在这里我们先介绍三个概念:进程组 / 作业 / 会话进程组之前我们说过每个进程都有自己的进程ID,那么进程组是什么呢?其实每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一...

2018-04-17 20:55:56 309

原创 基于单链表和基于环形队列的生产者单消费者模型

先来介绍一下生产者消费者模型,举一个常见的例子:生活中,我们会经常去超市买东西,这里涉及到了三个事物:我们、超市、供货商。很容易就可以想到,我们就相当于消费者,而供货商就相当于生产者,那么超市就算是一个交易场所了。对于生产者消费者模型我们可以简单的总结一下叫做 3 2 1原则 3:三种关系2:两个对象1:一个交易场所一个交易场所很容易理解,还有两个对象当然就算生产者和消费...

2018-04-09 17:33:01 544

原创 Linux----线程(同步与互斥)

在之前接触线程的时候,对它还不算特别了解,所以写出的总结就比较浅浅谈Linux线程 今天在之前博客的基础上在重新总结一下。 就不去解释线程的基本概念了,可以戳上面的链接线程相关函数线程创建#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *at...

2018-04-08 10:31:43 334

原创 Linux----详解信号

信号的概念信号是进程间通信机制中唯一的异步机制 来看看在Linux中都有哪些信号 kill -l 命令可以查看Linux中的信号列表 我们可以看到每个信号都有一个编号和一个宏定义名称,这些宏定义可以在头文件signal.h中找到。而且可以发现的是没有32、33号信号。1-31号信号叫做普通信号,34-64号信号叫做实时信号。 在这里对这些信号就不做详细的解释了,可以查看man手册...

2018-03-31 21:13:23 362

空空如也

空空如也

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

TA关注的人

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