c++
文章平均质量分 62
C++常见问题
笨鸟先飞飞飞
这个作者很懒,什么都没留下…
展开
-
strlen、strcpy、 memcpy实现
strlen实现int Strlen(const char * strSrc){ if(strSrc== NULL) return 0; int len = 0; while((*strSrc++)!='\0') { len++; } return len;}注意:计算char数组或者string长度的时候 结束符\n不参与计算sizeof(数组名)/sizeof(元素)同样能计算char数组长度,但是\0参与计算memcpy 与 strcpy函数原型:void *原创 2020-09-21 17:13:15 · 250 阅读 · 0 评论 -
智能指针shared_ptr实现
C++11提供了智能指针用于动态管理堆空间的内存分配与释放,通过维护智能指针这个栈对象使得当智能指针离开作用域时能够自动释放其管理的内存。其中,最常用的应该是shared_ptr, 提供了共享语义,也即多个指针共享同一个资源。实现原理维护一个指向资源的裸指针以及引用计数指针(都属于堆空间)。当智能指针离开作用域时,引用计数-1,当新生成一个智能指针时,引用计数+1,只有当引用计数=0时才会释放智能指针管理的内存空间。下面来看下shared_ptr的实现细节吧。#include <iostrea原创 2020-09-19 18:40:41 · 284 阅读 · 0 评论 -
C++11智能指针
C++动态内存管理是通过一对运算符完成, new/delete. new:在动态内存中对象分配一块空间并返回一个指向该对象的指针。delete: 通过指针销毁其指向的对象,并释放与之相关的内存空间。常见的两种问题是: 1. 忘记释放内存,内存泄漏2. 在还有其他指针指向对象的时候释放对象,造成指针引用非法内存---- 挂起引用智能指针被引入解决上述问题,在构造时分配内存,当离开作用域时负责自动释放指向对象的内存。C++98 提供第一种智能指针 auto_ptrauto_ptrvoid main(原创 2020-09-16 14:14:18 · 204 阅读 · 0 评论 -
C++ 11新特性
为了面试,冲冲冲!!!1. nullptr之前的编译器将NULL与0视为一种,那么对于一些函数void foo(char * );void foo(int);调用foo(NULL)可能会调用foo(int),这会导致重载发生混乱。为了区分空指针与0,引入nullptr。 nullptr可以隐式转化为任何指针类型。2. 类型推导auto引入auto 与 decltype实现类型推导。auto itr = vec.begin();auto i = 5;// int auto arr =原创 2020-09-15 01:04:02 · 281 阅读 · 0 评论 -
入栈、出栈顺序(卡特兰数)
卡特兰数公式:Catalann=∏i=1n−1Catalani∗Catalann−i Catalan_n = \prod_{i=1}^{n-1} Catalan_i * Catalan_{n-i}Catalann=i=1∏n−1Catalani∗Catalann−i公式:Catalann=1n+1C2nn=1n+1∗2n!n!∗n!Catalan_n = \frac{1}{n+1} C_{2n}^{n} = \frac{1}{n+1} * \frac{2n!}{n! * n!}Catala原创 2020-09-14 17:40:53 · 2924 阅读 · 1 评论 -
c++ 各种排序算法总结
概述常见的排序算法可以分为两大类:非线性时间比较类: 通过比较决定元素间的相对次序,最小时间复杂度为 O(nlogn)线性时间非比较类:不通过比较决定元素间的相对次数,线性时间运行算法复杂度1. 冒泡排序比较相邻元素的相对大小,如果反序则交换,如果是从小到大排序,那么第一次扫描可以确定最大的元素,第二次扫描确定次大元素,以此类推,需要n-1次扫描。代码:void bubbleSort(std::vector<int> &v){ int size = v.size原创 2020-09-11 21:36:00 · 362 阅读 · 0 评论 -
C++内存泄漏
内存溢出与内存泄漏:内存溢出指的是内存越界,一种常见情况是调用栈溢出,栈内存不足的一种。内存泄漏 内存申请后,用完没有释放,可用内存越来越少。内存泄漏是最难发现的错误之一,除非用完内存或者调用malloc失败,否则不会导致任何问题。windows平台下的内存泄漏检测:Visual Studio 调试器与C运行时库提供了一种检测内存泄漏的有效方法, 原理大致如下:内存分配需要通过C运行时库实现,在分配内存与释放内存时做好记录,然后在程序结束时对比分配内存与释放内存的记录既可以确定是否有内存泄漏问原创 2020-09-08 00:29:31 · 318 阅读 · 0 评论 -
linux下常用命令总结
进程相关:linux下 查看进程名以及占用端口查找进程pidps -ef(全格式) | grep 进程名grep是全局正则表达式输出的意思通过pid查看占用端口netstat -nap | grep 进程pidnetstat查看与网络层协议相关的统计数据3. 通过端口查看进程netstat -nap | grep 端口号top 动态显示当前占用资源最多进程信息kill 杀死进程 与top还有ps一起使用常用文件操作:cd 切换目录ls 显示目录信息touch原创 2020-09-07 23:51:25 · 102 阅读 · 0 评论 -
Linux系统下进程内存空间模型
Linux下每个进程都有一个虚拟内存空间,32系统下一般是 4G大小。其中包括:从高地址到低地址来讲分别有以下几种:整体上可以分为两种,内核区以及用户区,内核区中是一些用户代码不可见的区域,比如页表就存放在这个区域。用户区中从上到下分别是:a. 代码段: 可读不可写b. 数据段: 全局变量以及静态变量存放的区域c. 堆区: 动态内存,通过malloc, new 申请内存。d. 文件映射区域: 通过mmap系统调用,比如共享内存等映射物理空间的内存区域。e. 栈区:维护函数调用的上下原创 2020-09-07 23:00:13 · 588 阅读 · 0 评论 -
设计模式
设计模式的分类在设计模式这种书中提到的总共有23种设计模式,创建型、结构型以及行为型模式。创建型模式在创建对象的同时隐藏创建逻辑。结构型模式关注类与对象的组合行为型模式关注对象之间的通信常用的创建型模式有 工厂模式、抽象工厂模式,单例模式等等工厂模式:创建对象时不对客户端暴露创建逻辑。建立工厂类,对实现了同一接口的一些类进行实例的创建。工厂类类含有判断逻辑,决定创建哪一个产品类的实例。使用场景: 不同场景下创建不同的实例时。一般用于生成复杂对象,对于简单对象直接通过new完成创建即可.原创 2020-09-07 22:23:53 · 285 阅读 · 0 评论 -
数据结构——树
红黑树红黑树是一种特殊的二叉查找树,满足任意一个非叶节点的键值大于等于左边孩子的键值,小于等于右边孩子的键值。但与平衡二叉树不同,对孩子节点为根的子树深度要求没那么严格(深度差异不超过一),只要求其满足不超过二倍即可。红黑树的几个特性:每个节点包含颜色信息,红色或者黑色根节点是黑色叶子节点也是黑色(空节点)红色节点的孩子节点一定是黑色从一个节点开始的所有路径包含相同数目的黑节点黑高度:从节点出发x,到达叶子节点的任意路径上的黑色节点的数目称为黑高度,或者说阶。 (不包含节点x自身)原创 2020-08-15 16:49:45 · 78 阅读 · 0 评论 -
c++内存分配以及变量初始化
内存分配方式c++内存中分为5个区,分别是堆、栈、自由存储区、全局\静态存储区以及常量存储区堆: 操作系统维护的一块特殊内存,用于程序的内存动态分配。C语言使用malloc从堆上分配内存,free释放已分配内存。栈:执行函数时,函数的局部变量的存储单元是在栈空间创建,函数执行结束这些从存储单元会被自动释放。栈内存分配运算内置于处理器指令集上,效率很高,但内存容量有限。自由存储区:自由存储区是c++基于new操作符的一个抽象概念,凡是通过new操作符申请的内存都叫自由存储区。一般情况下,编译器在底..原创 2020-06-27 12:07:25 · 1560 阅读 · 0 评论 -
c++ 数组作为参数、返回值
数组作为参数写C++代码遇到数组作为参数,常常忘记怎么写形参,这里记录一下。一维数组作为参数传入数组 int []为了规范,常常需要将数组的size一同传入,这是因为C++/C遇到参数为数组时,不会去一个个拷贝数组内的元素(太过于耗时),此时数组在函数内退化为数组首地址。 使用sizeof(array)/sizeof(array[0])得到1,可以验证我们前面的说法。一般情况下,函数内经常需要使用数组的size,此时就需要我们将size传入函数。int sum(int array[],原创 2020-06-27 10:32:37 · 6072 阅读 · 1 评论 -
二分查找
发明KMP算法的Knuth大佬说二分查找:思路很简单,细节是魔鬼 二分查找真正的坑在于mid到底是加一还是减一,以及while里面到底是 < 还是 <=.下面根据常见的几个二分查找的场景尝试总结一下二分查找的编程框架,分为寻找一个数,寻找左侧边界,寻找右侧边界。在此过程中,对于mid以及while循环的细节问题进行编码检测,分析细节差异。二分查找框架int binarySearch(vector<int> nums, int target){ int left = 0,rig原创 2020-06-21 22:56:44 · 166 阅读 · 0 评论 -
杂乱知识点
面向对象与面向过程的区别面向过程是分析出解决问题需要的步骤,然后使用函数将这些步骤实现,调用的时候按照对应顺序进行调用优缺点:优点: 性能与面向对象高,类的调用需要实例化,开销较大,比较消耗资源,在单片机、嵌入式开发、linux等一般采用面向过程。相对来说不容易维护、复用以及扩展面向对象是将要解决的问题分解为各个对象,建立对象的目的不是完成一个步骤,而是为了描述某个事物在整个解决问题的过程中的行为。优缺点:优点:易维护、易复用、易扩展,面向对象具备封装、继承、多态的特性,系统更加原创 2020-06-21 11:07:45 · 96 阅读 · 0 评论 -
C++关键字解析
const关键字修饰变量 说明变量不可变修饰指针 分为指向常量的指针与指针常量 int * const p 与 const int * p修饰引用 常量的引用:经常用于形参,既避免了拷贝,又能避免函数对值的修改 没有引用常量修饰成员函数const成员函数不能修改成员变量const对象只能调用const成员函数,非const对象可以访问任意的成员函数,包括const成员函数const对象的成员是不可修改的,但是对象通过指针维护的对象是可修改的。const修饰成员函数时,准确说是修饰th原创 2020-06-16 11:23:01 · 180 阅读 · 0 评论 -
类与结构体
C++关键字 类与结构体的区别1. C与C++中struct的区别C++相对于C对struct进行了大量扩充,主要区别如下:上面这些差异,主要是由于C与C++编程思想的区别,C面向过程,C++面向对象。C中结构体主要是不同类型数据的集合,并不涉及算法与操作C++将数据变量以及相关的算法与操作封装进对象之中除了上面的这些,在使用的过程中也有一些区别: C中使用结构体需要加上struct,或者对结构体使用typedef取别名,C++中可直接使用结构体声明,C和C++使用同一个s..原创 2020-06-16 00:05:57 · 392 阅读 · 0 评论 -
c++程序编译过程
const关键字修饰变量: 说明变量不可以被改变修饰指针: 指针常量 与 指向常量的指针常量引用: 用于形参类型,避免了参数拷贝,又避免了函数对值的修改修饰成员函数: 说明该成员函数不能修改成员变量**(非静态数据成员)**,const对象只能调用const成员函数。非const对象也能调用const成员函数const成员函数能够被具有相同形参列表的非const成员函数重载。const函数写法: void fun(int a) const void const fun(int a)两原创 2020-06-13 13:16:36 · 430 阅读 · 0 评论 -
数组与指针
问题一:数组与指针的区别概念不同: 数组是存储多个相同类型数据的集合;而指针相当于一个变量,存放的是数据在内存中的地址。赋值不同: 数组的赋值只能一个个元素的赋值或者拷贝;同类型指针变量可以相互赋值访问数据方式不同: 数组可以直接访问,指针需要先解引用,然后访问指向地址的内容sizeof不同: 数组的size与元素类型还有个数有关,而指针变量的大小与32 64位操作系统有关。指针与数组名异同: 指针与数组名都可以表示地址,但是指针是变量可以修改,数组名是常量不可以修改赋值。当数组传参的时候,数组原创 2020-06-13 00:02:20 · 100 阅读 · 0 评论