C/C++
程序猿王老铁
心有猛虎,细嗅蔷薇
展开
-
指针和引用的区别
指针和引用的区别引用 引用是一个对象的别名,主要用于函数参数和返回值类型,引用必须初始化,引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。 作用: 【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值 【引用传递】如果形参为引用类型,则形参是实参的别名 【指针传递】做返回值int a = 10;int &b = a;2.const引用 co原创 2017-11-10 11:50:43 · 194 阅读 · 0 评论 -
static的作用解析
在C语言中static的作用如下第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。第二、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。第三、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存原创 2017-11-18 13:26:26 · 192 阅读 · 0 评论 -
面试题:虚函数与纯虚函数的区别
1.虚函数和纯虚函数可以定义在同一个类中,含有纯虚函数的类被称为抽象类,而只含有虚函数的类不能被称为抽象类。2.虚函数可以被直接使用,也可以被子类重载以后,以多态的形式调用,而纯虚函数必须在子类中实现该函数才可以使用,因为纯虚函数在基类有声明而没有定义。3.虚函数和纯虚函数都可以在子类中被重载,以多态的形式被调用。4.虚函数和纯虚函数通常存在于抽象基类之中,被继承的子类重载,目的是提供...原创 2018-09-03 17:21:11 · 4065 阅读 · 0 评论 -
C++:while(cin>>tmp)无法结束
有这样一段代码:int tmp;vector<int> arr;while (cin >> tmp){ arr.push_back(tmp);}for (int i = 0; i < arr.size(); i++){ cout << arr[i] << ' ';}运行输入:结果是无法结束,怎么回事呢?...原创 2018-09-14 20:25:46 · 2901 阅读 · 0 评论 -
C++:堆栈溢出问题?
堆栈溢出的原因1.函数调用层次太深。函数递归调用时,系统要在栈中不断保存函数调用时的现场和产生的变量,如果递归调用太深,就会造成栈溢出,这时递归无法返回。再有,当函数调用层次过深时也可能导致栈无法容纳这些调用的返回地址而造成栈溢出。2.动态申请空间使用之后没有释放。由于C语言中没有垃圾资源自动回收机制,因此,需要程序主动释放已经不再使用的动态地址空间。申请的动态空间使用的是堆空间,动态空...原创 2018-09-21 18:31:09 · 4103 阅读 · 0 评论 -
STL之迭代器&&迭代器失效
1.说说设计模式?(迭代器模式) 迭代器模式作为STL的六大组件之一,通俗来讲,它就是用来遍历容器的,对容器进行一定的操作。我们通常使用的容器vector、list、map、set、multimap、multiset、deque,内部是实现有顺序表、链表、红黑树。如果我们遍历这些容器就要明白它们的底层构造,相当不方便。iterator被定义出来就是不需要了解这些容器的底层实现,来...原创 2018-08-11 19:59:59 · 486 阅读 · 0 评论 -
B树、B+树、B*树
B+树B+树的特点与B树的区别内部节点中,关键字的个数与其子树的个数相同,不像B树种,子树的个数总比关键字个数多1个所有指向文件的关键字及其指针都在叶子节点中,不像B树,有的指向文件的关键字是在内部节点中。换句话说,B+树中,内部节点仅仅起到索引的作用,在搜索过程中,如果查询和内部节点的关键字一致,那么搜索过程不停止,而是继续向下搜索这个分支B+树的分裂:当一个结点满时,分配一个新的结点,并原创 2017-11-18 13:14:50 · 235 阅读 · 0 评论 -
大数据问题面试题
1、给一个超过100G大小的 log file,log中存着IP地址,设计算法找出出现次数最多的IP地址? 由于超过100G,那必须对文件进行切分。 (1)切分,可以切成100份,每份有1G,那哈希表的大小就是100,利用字符串哈希算法将字符串IP转换成整型 (2)过哈希切分,同一个ip就会分割到同一个文件。 (3)是依次将这100个文件读入内存中,统计ip出现的次数,依次进行比较,原创 2017-11-18 23:43:21 · 730 阅读 · 0 评论 -
判断是否平衡树的优化算法
平衡二叉搜索树左右高度差不超过1 高度可以保持在log2N,插入/删除/查找效率log2N1.左边增加结点,bf–,右边增加结点,bf++ 2.如果增加过后,bf==0,说明高度不变,填平了矮的一边 3.如果bf==|1|,说明本来平衡,继续往上更新bf 4.如果bf==|2|,不再更新,开始调整旋转 1.左单旋/右单旋 2.右左双旋/左右双旋面试题判断一个二叉树是...原创 2018-03-25 16:56:20 · 339 阅读 · 0 评论 -
二分查找有这么简单?
题目一给定一个有序(非降序)数组A,求任意一个i使得A[i]等于key,不存在则返回-1这个是最原始的二分查找题目,利用数组的有序特性,拆半查找,使得查找时间复杂度为O(logN)。int search(int arr[], int n, int key) { int low = 0, high = n-1; while(low <= high)...原创 2018-07-19 14:55:45 · 205 阅读 · 0 评论 -
复习—C复习重点总结
C复习重点总结 1.static/const/volatile关键字在C/C++中的作用 2.结构体的内存对齐规则、位段的内存分配、枚举的优点 3.指针 4.前置++,后置++ 5.#define定义的宏和函数的比较 6.sizeof与strlen 7.形参和实参 8.大小端问题 9.指...原创 2018-07-26 14:01:49 · 426 阅读 · 0 评论 -
C语言复习—static/const/volatile关键字
static/const/volatile关键字static 先从C语言开始 1- static修饰代码块内部的变量(局部变量),改变了变量的存储类型,变量将从栈区转到静态区,不改变变量的属性和作用域。 2- static修饰局部变量,具有 “记忆性” 的特点,还可以延长它的生命周期。 3- 普通的局部变量是在栈上分配空间,因此每次调用函数时,分配的空间可能都不...原创 2018-07-26 14:05:29 · 346 阅读 · 0 评论 -
C语言复习—结构体的内存对齐规则、位段的内存分配、枚举的优点
结构体的内存对齐规则、枚举的优点结构体 如何对齐 1. 将结构体第一个成员放在与结构体偏移量为0的地址处; 2. 其他成员要对齐到对齐数的整数倍处,对齐数 = 编译器默认的一个数字 与 该成员大小的较小值。 3. 结构体的总大小为对最大齐数的整数倍。 对齐原因 1. 栈上存储的数据内存尽可能的在自然边界上对齐。 2. 为了访问未对齐的内存,...原创 2018-07-26 14:09:36 · 321 阅读 · 0 评论 -
C语言复习—谈谈你理解的指针
指针讲讲你理解的指针 什么是指针呢? 指针实质上就是地址,而地址是内存单元的编号(不能重复),所以说,一个变量可以有两个地址,但是两个变量不能存在同一块地址空间中。指针就是一个存放地址的变量。指针也有大小,在32位平台下是4个字节,在64位平台下是8个字节。指针相减运算求的是两块内存之间的地址差。 为什么要用指针? 1. 可以处理堆中存放的大型数据。 2. 可以...原创 2018-07-26 18:09:49 · 546 阅读 · 0 评论 -
C语言面试题总结
1 预处理问题1:什么是预编译?何时需要预编译?答:预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等。.何时需要预编译:1、总是使用不经常改动的大型代码体。2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包...转载 2018-07-26 22:07:16 · 30299 阅读 · 1 评论 -
C/C++经典面试题总结
面试题3:sizeof和strlen的区别sizeof和strlen有以下区别: sizeof是一个操作符,strlen是库函数。 sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数。 编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而...原创 2018-07-27 09:39:37 · 2226 阅读 · 0 评论 -
C++面试经典总结
1. 面向对象的程序设计思想是什么?答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。2. 什么是类?答:把一些具有共性的对象归类后形成一个集合,也就是所谓的类。3. 对象都具有的两方面特征是什么?分别是什么含义?答:对象都具有的特征是:静态特征和动态特征。静态特征是指能描述对象的一些属性(成员变量),动态特征是指对象表现出来的行为(成员函数)...转载 2018-07-27 09:46:07 · 1731 阅读 · 0 评论 -
C语言复习—宏与函数、sizeof与strlen区别总结
#define定义的宏和函数的比较程序编译过程 预编译阶段(*.i) —>编译(*.s)—>汇编(*.o)—>链接 预处理在预编译阶段,做一些代码文本的替换工作,主要处理#开头的预编译指令。 C语言提供的预处理功能有: 1)宏定义 2)文件包含 3)条件编译 宏定义的函数和用户自定义的函数的区别及优缺点? 宏的优势 ...原创 2018-07-27 11:46:42 · 1413 阅读 · 0 评论 -
C语言-静态实现顺序表
C语言实现了个静态的顺序表,如果有不对的地方,还请指正SeqList.h#ifndef _SEQLIST_H_#define _SEQLIST_H_#include &amp;lt;stdio.h&amp;gt;#include &amp;lt;assert.h&amp;gt;#include &amp;lt;stdlib.h&amp;gt;#include &amp;原创 2018-04-19 14:50:27 · 356 阅读 · 0 评论 -
C语言动态实现顺序表
顺序表的动态存储结构:typedef int DataType;typedef struct SeqListD{ DataType* array;//数据指针 size_t capacity; //容量 size_t size; //有效元素的个数}SeqListD, *PSeqListD;部分函数操作: void InitSeqListD(P...原创 2018-04-25 15:48:16 · 616 阅读 · 0 评论 -
C语言重点关键字总结
const-------------->(距离谁近修饰谁)const修饰变量变量不可变,必须在声明时就被初始化const修饰指针const* int a; // 指针指向的变量不可变 const int * a; // 指针指向的变量不可变 int * const; // 指针指向的地址不可变 int * const * a; // 指针指向的变量...原创 2018-04-25 15:55:32 · 278 阅读 · 0 评论 -
解析c++中函数重载的实现原理
1.剖析C++是如何实现重载的? 2.解析面试题:在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明? 1.函数重载的实现原理函数重载的定义:当两个及两个以上函数共用一个函数名,但是形参个数或者类型不同,编译器根据实参与形参的类型及个数的最佳匹配,自动确定调用那一个函数。也就是说,在同一作用域,一组函数名相同,参数列表不同(个数和类型),返回类型可同,原创 2017-11-12 12:05:13 · 3267 阅读 · 0 评论 -
malloc/free与new/delete
malloc/free与new/delete不同点:操作对象有所不同。 malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行原创 2017-11-18 22:50:16 · 162 阅读 · 0 评论 -
常见排序算法
常见排序:1、直接插入排序 在给定数组中,拿出一个数M,与前面的数相比较,如果M大于前面的数,位置不变,如果小于前面的数,就依次比较,将大于M的数依次往后挪,找到M的正确排序的位置。 2、希尔排序 希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进。希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个原创 2017-11-23 20:27:36 · 298 阅读 · 0 评论 -
复习C++之思维导图
get到一个优秀C++思维导图,C++知识写的很详细,不多说了直接上图吧:原创 2018-03-26 19:29:13 · 1469 阅读 · 2 评论 -
快速排序的实现与优化
快排的基本思想: 1)选择一个基准元素key,通常选择第一个元素或者最后一个元素 2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部 分记录的元素值均比key值小。另一部分记录的元素值比key值大。 3)此时key在其排好序后的正确位置 4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。三种实现方法1、左右指针法 算法思想:原创 2018-04-01 22:51:16 · 259 阅读 · 0 评论 -
C++继承之继承基础
一、继承的相关概念 继承是⼀种复⽤⼿段,在继承关系⾥子类继承父类的成员,由此达到复⽤的⽬的。通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质不同的东西。二、三种访问限定符&继承关系三、继承的重要说明1.子类拥有父类的所有成员变量和成员函数2.子类就是一种特殊的父类3.子类对象可以当作父类对象使用4.子类可以拥有父类没有的方法和属性四.派生类(子类)的访问控制...原创 2018-05-02 22:32:39 · 269 阅读 · 0 评论 -
面试题:用C++实现一个不能被继承的类
剑指offer面试题:用C++实现一个不能被继承的类因为子类继承父类,子类的构造函数和析构函数会调用父类的构造,解决问题的方法就是,不允许子类的构造函数调用父类的构造与析构。--------------------------------------------------------------------将父类的构造函数和析构函数设置为private成员函数,私有成员只能被自身的类访问。1./...原创 2018-04-25 14:49:36 · 603 阅读 · 0 评论 -
面试题:实现一个只能在堆上(栈上)生成对象的类
简述问题:1、只能在堆上生成对象:将析构函数设置为私有。原因:C++是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象。2、只能在栈上生成对象:将new和 delete 重载为私有。原因:在堆上生成对象,使用new关键词操作,其过程分为两阶段:第一阶段,使用new在堆上寻找可用内存,分配给对象;第二阶段...原创 2018-04-25 15:35:40 · 921 阅读 · 0 评论 -
C++继承之菱形继承与虚函数
一、单继承&多继承&菱形继承单继承与多继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承菱形继承菱形继承引发的问题:数据冗余例:B、C中的_a都是来自于A,其实两个_a是同一个,但是因为B、C各自继承,产生了两份,造成了数据冗余二义性例:由于D继承于B、C,B、C继承于A,所以D中的_a不知道是来自B还是来自...原创 2018-05-03 12:26:50 · 1033 阅读 · 0 评论 -
C++多态的实现原理
一、多态的概念 多态就是多种形态,C++的多态分为静态多态与动态多态。静态多态就是重载,因为在编译期决议确定,所以称为静态多态。在编译时就可以确定函数地址。动态多态就是通过继承重写基类的虚函数实现的多态,因为实在运行时决议确定,所以称为动态多态。运行时在虚函数表中寻找调用函数的地址。 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实...原创 2018-05-05 13:22:47 · 31700 阅读 · 7 评论 -
C++多态之带有虚函数的菱形继承与菱形虚拟继承
一、菱形继承那就先从菱形继承开始复习如下代码:#include<iostream> using namespace std;class A{public: int _a;};class B : public A{public: int _b;};class C : public A{public: int _c;};class D : pub...原创 2018-05-06 19:19:48 · 695 阅读 · 0 评论 -
引用
一、什么是引用 引用不是定义一个新的变量,而是给某一已有的变量起一个别名,对引用的操作与对变量直接操作完全一样。 引用的格式: 类型 &引用变量名=目标变量名; 【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名 说明: (1)&在此不是求地址运算,而是起标识作用。 (...原创 2018-05-21 18:42:06 · 759 阅读 · 0 评论 -
冒泡排序的优化
传统的冒泡排序算法我们应该很熟悉,主要的原理是:1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3.针对所有的元素重复以上的步骤,除了最后一个。4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。但是此种方法每一趟循环只能找到一个最大或者最小...原创 2018-07-24 15:12:39 · 174 阅读 · 0 评论 -
动态内存分配、malloc与new的区别
内存分配先看内存的分布状况 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束 时可能由OS回收 。分配方式...原创 2018-07-29 10:03:27 · 30448 阅读 · 5 评论 -
C++四种强制类型转换的机制与功能
C++四种强制类型转换1.static_cast(编译时处理)用于两个相关的类型的转换,属于静态转换(非多态类型转换)2.const_cast(编译时处理)删除已有变量的const属性,方便赋值,但是修改的话还是要加上volatile关键字只能对指针或者引用去除或者添加const属性,对于变量直接类型不能使用const_cast; 不能用于不同类型之间的转换,只能改变同种...原创 2018-08-09 11:29:19 · 1323 阅读 · 0 评论 -
C++11新特性之一
1.初始化方式C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号 (=),也可不添加。vector<int> v;v.pushback(1);...vector<int> v{1,2,3,4,5};...map<string,string> dict{{"in...原创 2018-08-09 01:33:30 · 260 阅读 · 0 评论 -
Struct和Class的区别
一、c++最初被称为“c with class”,足见class在c++中的地位。在c++中我们可以用class自定义用户数据类型,然而它还存在一个类似的——struct,他们似乎有着太多的相同的特点与功能。C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。最本质的一个区别就是默认的访问控制,体现在两个方面: ...原创 2018-09-03 17:13:07 · 1023 阅读 · 0 评论 -
C语言复习—模拟实现C库函数、atoi
模拟实现C语言库函数str库函数\#include <stdio.h> \#include <stdlib.h> \#include <assert.h> 1.模拟实现strcpy 将源字符串src拷贝赋值到目标字符串dest中char *my_strcpy(char *dest, const char* src){ ass...原创 2018-08-01 15:40:47 · 298 阅读 · 0 评论