- 博客(54)
- 资源 (1)
- 问答 (3)
- 收藏
- 关注
原创 2021-03-30
C与C++区别C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。下面我们一步一步来分析C++与C的不同:..
2021-03-30 14:42:43 176
原创 display标签
.container { display: flex; height: 100%; flex-direction: column; overflow: hidden; background-color: #fff;}display 标签display 属性可以设置元素的内部和外部显示类型 display types。元素的外部显示类型 outer display types 将决定该元素在流式布局中的表现(块级或内联元素);元素的内部显示类型 inner display type
2021-01-20 11:02:44 2062
原创 JavaScript的运行 safari 中文显示乱码
这里写自定义目录标题JavaScript的运行safari 中文显示乱码JavaScript的运行在html文件中加入<script type="text/javascript"><!--代码//--></script>保存成一个文件, 扩展名是 .js,然后在 html 文件中加入<script type="text/javascript" src="代码文件的路径和文件名"></script> 作为事件, 比如
2021-01-19 11:03:59 747
原创 操作系统原理及应用
第一章 操作系统引论从用户的观点看,操作系统是用户与计算机硬件之间的接口操作系统在计算机系统中位于 计算机硬件和用户软件 之间高级程序设计语言的编译器 不是操作系统关心的主要问题。操作系统的逻辑结构不包含 混合型结构相对于单一内核结构,采用微内核结构的操作系统具有诸多好处,但 使系统更高效 并不是微内核结构的优势操作系统的三种基本类型 批处理、分时、实时操作系统...
2020-12-07 16:58:04 707
原创 TCP/IP四层模型
应用层 (HTTP协议,FTP协议,DNS协议,TELNET协议,SMTP协议,FINGER协议,WHOIS协议,IRC协议,GOPHER协议,USENET协议)传输层(TCP协议,UDP协议)网络层 (IP协议,ICMP协议)物理层 (ARP协议,RARP协议)...
2020-11-15 11:51:12 122
原创 层序遍历
#include <iostream>#include <queue>using namespace std;struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(nullptr), right(nullptr){}};void levelOrder(TreeNode *root){ if(root==nullp
2020-11-15 01:42:58 103
原创 线程的创建与管理
线程的创建#include <iostream>#include <thread> //头文件using namespace std;void greeting(){ cout << "Hello multithread!"<<endl; return;}int main(){ thread t{greeting}; //列表初始化 t.join(); //确保主线程在子线程退出之后才退出 retur
2020-11-13 18:26:36 164
原创 Subversion 与 Git
Subversion特点概括起来主要由以下几条:每个版本库有唯一的URL(官方地址),每个用户都从这个地址获取代码和数据;获取代码的更新,也只能连接到这个唯一的版本库,同步以取得最新数据;提交必须有网络连接(非本地版本库);提交需要授权,如果没有写权限,提交会失败;提交并非每次都能够成功。如果有其他人先于你提交,会提示“改动基于过时的版本,先更新再提交”… 诸如此类;冲突解决是一个提交速度的竞赛:手快者,先提交,平安无事;手慢者,后提交,可能遇到麻烦的冲突解决。好处每个人都可以一定程度上
2020-11-12 17:09:53 324
原创 慢启动 拥塞避免 快重传 快恢复
慢启动问题:最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。解决方法:因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。具体来说,当新建连接时,cwnd(congestion window)初始化为1个最大报文段(Maximum Segment Size, MSS)大小,RFC 2581 规定,它的大小不超过 2MSS ,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认
2020-11-12 16:32:40 1219
原创 指向类成员的指针 通过偏移得到私有变量
非静态成员#include <iostream>//非静态成员指针using namespace std;class A{public: void NonStaticFunc(int arg){ nonStaticMember = arg; cout<<nonStaticMember<<endl; } int nonStaticMember;};//定义类型 返回类型(类名::指针类型名)(参数列
2020-11-12 14:08:19 178
原创 C++11 新特性
1、指针、智能指针(nullptr、shared_ptr、std::weak_ptr)(1)nullptr作用: C++11 引入了 nullptr 关键字,专门用来区分空指针、0原有问题:传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL实现:nullptr 的类型为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。当需要使用 NULL 时候,养成直接使用 nullptr的习惯NULL的定义#ifdef __c
2020-11-11 22:23:39 616 1
原创 vector push_back 时间复杂度
#include <iostream>#include <vector>using namespace std;int main(){ vector<int> vec; int last = 0; for(int i = 0; i <= 1e5; i++){ vec.push_back(1); if(last!=(int)vec.capacity()){ c
2020-11-03 07:59:56 1353
原创 vim常用快捷键
模式切换Vim一共有4个模式:正常模式 (Normal-mode) :正常模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作插入模式 (Insert-mode):在正常模式中按下i, I, a, A等键命令模式 (Command-mode):在正常模式中,按下:(冒号)键,会进入命令模式可视模式 (Visual-mode):在正常模式按下v, V, <Ctrl>+v,可以进入可视模式。显示行号set nu 显示行号set nonu 不显示行号删除行文本相关首先前提是在编辑
2020-11-03 07:25:42 218
原创 ReverseList
#include <iostream>using namespace std;struct ListNode{ int val; struct ListNode *next; ListNode(int x): val(x), next(nullptr){}};ListNode* ReverseList(ListNode *pHead){ if(!pHead) return nullptr; ListNode *fakeEnd = n
2020-10-29 19:15:31 121
原创 斐波纳切数列
题目大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39示例1输入4返回值3代码#include <iostream>using namespace std;int fibonacci(int n){ if(n == 1 || n == 0) return n; int first = 0, second = 1, sum = 0; for(int i=2; i<=n
2020-10-28 22:03:55 790
原创 C++ 常见 内存 错误
野指针野指针:指向不可用内存区域的指针。如果对野指针进行操作,将会使程序发生不可预知的错误,甚至可能直接引起崩溃。野指针不是NULL指针,是指向**“垃圾”**内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是野指针是很危险的,也具有很强的掩蔽性,if语句对它不起作用。造成野指针的常见原因有三种:指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针。在Debug模式下,VC++编译器会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是
2020-10-22 10:04:09 138
原创 进程、线程、协程 进程间的通信方式 IO多路复用的方式
进程:进程是系统进行资源分配和调度的⼀个独立单位,一个程序在一个数据集中的一次动态执行过程,可以简单理解为“正在执行的程序”。进程一般由程序、数据集、进程控制块三部分组成程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志;进程的局限是创建、撤销和切换的开销比较大线程:线程是进程的⼀个实体, 也叫轻量级进程,是CPU调度和分派的基本单位,
2020-10-20 14:10:27 632 2
原创 函数指针指针函数
指针函数指针函数本质是一个函数,返回值是某一类型指针int* fun(int x,int y);函数指针函数指针是指向函数的指针,本质是指针变量//申明与赋值int (*fun)(int x,int y);fun = &Function;或者int (*fun)(int x,int y);fun = Function;//调用a = (*fun)();a = fun();函数指针数组#include<iostream>using namespace
2020-10-20 14:06:18 83
原创 智能指针
unique_ptr左值右值左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式)。需要注意的是,左值是指表达式结束后依然存在的持久对象,而右值是指表达式结束时就不再存在的临时对象。T& 指向的是 lvalue,而 const T& 指向的,却可能是 lvalue 或 rvalue,左值引用&与右值引用&&(右值引用是c++11加上的)。move和forward:需要明确的是,move函数可以是
2020-10-20 13:58:05 137
原创 C++类或结构作为map的key值
1.只有重载<的类或者结构才能作为map的key值。string可以作为key值是因为string重载了<2.如果不重载<会提示如下错误:error C2676: 二进制“<”: “const C”不定义该运算符或到预定义运算符可接收的类型的转换...
2020-10-20 08:58:12 832
原创 static_cast dynamic_cast
static_cast用法:static_cast < type-id > ( exdivssion )该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:①用于类层次结构中基类和子类之间指针或引用的转换。 进行上行转换(把子类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。②用于基本数据类型之间的转换,如把int转换成char,把in
2020-10-19 15:43:30 202
原创 继承/组合关系时 构造/析构函数执行顺序 虚析构函数存在的意义
继承/组合关系时 构造/析构函数执行顺序#include <iostream>using namespace std;class A{public: A(){ cout<<"A"<<endl; } ~A(){ cout<<"~A"<<endl; } };class B:public A{public: B(){ cout<<"
2020-10-19 14:41:43 132
原创 linux df
(base) ➜ ~ df 文件系统 1K-块 已用 可用 已用% 挂载点udev 8137076 0 8137076 0% /devtmpfs 1633052 2128 1630924 1% /run/dev/sda10 199793984 56065704 133509632 30% /tmpfs 8165248 352300
2020-10-19 08:37:19 297
原创 linux gdb
gdb启动gdb对C/C++程序的调试,需要在编译前就加上-g选项:$ g++ -g hello.cpp -o hello调试可执行文件:$ gdb <program>program也就是你的执行文件,一般在当前目录下。调试core文件(core是程序非法执行后core dump后产生的文件):$gdb <program> <core dump file>$gdb program core.11127调试服务程序:$ gdb <program
2020-10-17 22:20:33 159
原创 重载运算符 不能重载的运算符 单目/双目/三目运算符 重载运算符的方式 友元函数
重载运算符您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。不能重载的运算符写法解释.成员访问运算符., ->成员指针访问运算符::域运算符sizeof长度运算符?条件运算符(三目运算符)#预处理符号单目/双目/三目运算符单目就是这
2020-10-17 11:47:13 1703
原创 自旋锁和互斥锁
互斥锁(mutexlock):最常使用于线程同步的锁;标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁;临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程睡眠等待锁释放时被唤醒。在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或pthread函数库)保证了如果一
2020-10-09 21:24:47 414
原创 手撕快排
#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace std;void quickSort(int arr[], int low, int high){ if(low>=high) return; int key = arr[low]; int left = low; int right = high; while
2020-10-09 14:06:14 161
原创 C语言实现继承多态
#include <string.h>#include <stdio.h>struct animal{ char name[20]; void (*speak)();};void Animal(struct animal *this, const char *name, void(*fun)()){ strcpy(this->name, name); this->speak=fun;}struct
2020-10-08 21:59:27 2828 1
原创 孤儿进程 僵尸进程 解决办法
定义孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。危害unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程
2020-10-08 20:09:31 421
原创 linux top命令
top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombieCpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% siMem: 191272k total, 173656k used, 17
2020-10-08 16:18:04 335
原创 哈希函数 一致性哈希
哈希函数1.直接寻址法。取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)2.数字分析法。分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
2020-10-06 14:13:02 449
原创 拷贝构造函数 浅拷贝遇到的问题 如何用深拷贝解决
使用条件:1.明确表示由一个对象初始化另一个对象2当对象作为函数的实参传递给形参时3当对象作为函数的返回值时#include <iostream>using namespace std;class Person{ private: int m_age; public: Person(int age):m_age(age){ cout<&
2020-10-05 21:26:51 233
原创 找到虚函数地址
#include <iostream>using namespace std;class Base{public: virtual void func(){cout<<"Base!"<<endl;} virtual void func2(){cout<<"Base!!"<<endl;}};class Derived:public Base{public: virtual void func
2020-10-05 20:04:58 225
原创 Python中is和==的区别
>>> a = 1 #a和b为数值类型>>> b = 1>>> a is bTrue>>> id(a)14318944>>> id(b)14318944>>> a = 'cheesezh' #a和b为字符串类型>>> b = 'cheesezh'>>> a is bTrue>>> id(a)42111872>>
2020-10-05 17:06:10 400
原创 C++ 网络编程
TCP与UDP的比较TCP是面向连接的,交互双方的进程各自建立一个流式套接字,服务器需要等待客户端向其提出连接申请。一旦接受客户端申请就立刻返回一个新的套接字描述符。通过该描述符调用数据传输函数与客户端进行数据的收发。UDP是面向无连接的,双方建立的是数据报套接字,服务器和客户端在进行传描数据之前不需要进行连接的申请和建立,可以随时向对方发消息。TCP优点:可靠、稳定缺点:速度慢,效率低、占用系统资源高、易被攻击。适合场景:网络通讯质量要求高(可靠、稳定)UDP优点:速度快,比TCP稍安全
2020-09-21 18:26:32 621
原创 C++类的大小 虚析构函数
#include <iostream>using namespace std;class P { int a; //4字节public: virtual ~P() { //父类的虚析构函数 //4字节 std::cout << "P destructor!" << std::endl; }};class Child :public P { int b; //4字节public: virtual ~Ch
2020-09-20 16:46:54 261
原创 C++的内存 堆、栈、自由存储区、全局/静态存储区和常量存储区
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。全局/静态存
2020-09-20 15:33:46 244
原创 static关键字 C++
特点:1、static是一个修饰符,用于修饰成员(成员变量,成员函数);2、static修饰的成员被所有的对象共享;3、static优先于对象存在,因为static的成员随着类的加载就已经存在。成员变量和静态变量的区别:生命周期的不同:成员变量随着对象的创建而存在随着对象的回收而释放。静态变量随着类的加载而存在随着类的消失而消失。调用方式不同:成员变量只能被对象调用。静态变量用类名调用。(推荐用类名调用)数据存储位置不同:成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。静
2020-09-20 14:48:10 97
原创 进程间的通信方式
管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。管道是一种最基本的IPC(Inter-Process Communication)机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:其本质是一个伪文件(实为内核缓冲区)由两个文件描述符引用,一个表示读端,一个表示写端。规定数据从管道的写端流入管道,从读端流出。命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无
2020-09-17 13:19:42 395
原创 C++ 编译 编译预处理 优化 函数调用约定 汇编 链接
C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织,形成最终生成可执行代码的过程。过程图解如下:从图上可以看到,整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。编译过程编译过程又可以分成两个阶段:编译和汇编。编译编译是读取源程序(字符流),对之进行词法和语法的分析,将高
2020-09-16 12:58:56 468
vscode 启动程序 opencv绘图出现异常
2022-02-09
C++导入*.h头文件后 出现LNK2001无法解析的外部符号 含有opencv库
2019-10-23
导入*.cpp文件后,编译出现错误error LNK2005
2019-10-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人