![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 71
choudan8888
给未来一个机会
展开
-
C++四种类型的强制转换
1. static_caststatic_cast<new_type>(expression)相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型,用来强迫隐私转换主要用于一下几种用法 1.用于类层次结构中基类和派生类之间指针或者引用的转换 Base* bp = static_cast<Derived*>(dp) 2.用于基本数据类型之间的转换,int->char char a = 'a...原创 2021-08-25 15:53:09 · 219 阅读 · 0 评论 -
简单实现C++ hashmap(包含iterator)
原理:原理很简单就是数组和链表,数组是用来散列的,链表主要用来存储的,链表的长度超过8个就转为红黑树(没实现)。直接上代码:#include<iostream>#include<string>#include<unordered_map>using namespace std;#define LOADFACTOR 0.75#define EXPANDFACTOR 2template<class Key, class Value>原创 2021-08-13 15:08:09 · 963 阅读 · 0 评论 -
实现C++中的Vector
Vector使用模板实现的,里面不仅包含了常用的增删改查,而且包含了迭代器;除了常用的数据类型可以使用之外,自定义的数据类型也可以使用。一下是代码:#include<iostream>#include <stdio.h>#include<assert.h>#include <conio.h>#include<algorithm>#include<vector>using namespace std;tem...原创 2020-09-23 13:49:28 · 99 阅读 · 0 评论 -
关于循环的小点滴
1.for循环for(表达式1;表达式2;表达式3){语句块1}表达式1:初始化,最早被执行,有且执行一次表达式2:判断,每次进入循环都要判断,每次执行表达式3:步进,在语句块1之后执行,每次执行一次例子:求两个数的最大公约数#include<stdio.h>int GreatestComDiv(int m,int n){...原创 2018-03-18 21:00:05 · 134 阅读 · 0 评论 -
和宏的那些事
宏,就是字符替换例子:#define M(x,y,z) x*y+zvoid main(){ int a=1,b=2,c=3; printf("%d\n",M(a+b,b+c,c+a));//a+b*b+c+c+a=12}#define POW(x) (x)*(x)#define DOUBLE(x) (x)+(x)void Fun(bool b)...原创 2018-03-18 22:17:04 · 153 阅读 · 0 评论 -
指针的算数运算
1.字节数 char short int float double long longlong字节数 1 2 4 4 8 4 82. 指针+1,计算指针+1具体加几个字节的方法是,给指针去掉...原创 2018-03-27 15:45:20 · 266 阅读 · 0 评论 -
动态内存
一.栈和堆的区别栈的内存小,Windows系统默认为1M,消耗的内存系统会自动回收,不会出现内存不够的情况。堆的特点是内存大,2G左右,需要程序员回收,申请(malloc)出来的内存若不释放,会出现内存泄露。二.malloc、calloc、realloc、free的联系1.malloc申请新的空间,创建动态内存数组intn=10; int*p=(int*)...原创 2018-04-08 22:56:38 · 114 阅读 · 0 评论 -
是数组,指针还是函数???
由于优先级的存在,在一些复杂的定义中,我们很难判断他们是函数还是指针或者是数组,我们可以用一下方法来解决这一类问题。一、判断数据类型具体步骤有以下两步:(1)确定属性(即其为指针?数组?还是函数?)这个主要根据优先级来判断 int (*p)[4] //()的优先级高于[] ...原创 2018-04-12 20:40:06 · 116 阅读 · 0 评论 -
编译和链接的那些故事
编译连接过程从预编译->编译->汇编->连接(1)预编译 gcc -E main.c -o main.i 内部处理:宏定义处理、头文件包含的指令、删除注释、特殊符号的处理(2)编译 gcc -S main.i -o main.s 编译环节是对源代码进行语法分析,并优化产生对应的汇编代码 生成符号、产生汇编代码 (3)汇编...原创 2018-10-29 23:23:44 · 315 阅读 · 0 评论 -
关于逆序输出n的每一位
1.给出一个数n,从个位丢弃 对n进行除以10操作,并将其赋值给下一次除以10操作的n,每进行一次操作,计数器加1,直至n为0.统计输出计数器的个数为这个数字的位数 eg :对123进行求位数计算则先将123/10=12,12/10=1,1/10=0,即n=3;#include<stdio.h>int Figure(int n){int c...原创 2018-03-17 20:47:13 · 557 阅读 · 0 评论 -
同名函数的三种关系(重载,隐藏,覆盖)
1.重载函数名相同 作用域相同 函数参数不同class Base{public: //这两个函数构成重载 void show() { cout << "Base::void show()" << endl; } void show(int i) { cout << "virtual void show(int i )" <...原创 2019-08-01 21:01:51 · 3898 阅读 · 0 评论 -
sizeof()和strlen()的区别
sizeof和strlen的区别1.sizeof是运算符,strlen是函数2.sizeof可以用类型做参数,而strlen只能用char*做参数,且必须是以'\0'结尾的,sizeof还可以用函数做参数例如:short fun();printf("%d\n",sizeof(f()));输出的结果是sizeof(shotr) ,等于23.数组所谓哦sizeof的参数不退化...原创 2019-08-11 12:04:00 · 126 阅读 · 0 评论 -
内联函数和宏定义
内联函数内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调试,在编译的时候内联函数可以直接被镶嵌到目标代码中去。而宏只是简单的替换。内联函数有参数的类型检查,而宏没有类型检查。inline是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小的代码来说,inline增加空间消耗换来的是效率提高,这方面和宏是一模一样的,但是inline在和宏相比没有付...原创 2019-08-11 12:31:18 · 143 阅读 · 0 评论 -
智能指针详解
什么是智能指针?智能指针就是用一个类来封装一个指针 主要负责自动的来释放内存,防止发生内存泄漏智能指针的思想 智能指针中存储的是指向动态对象的指针,用于动态对象生存周期的控制,能够确保自动且正确的销毁动态对象,防止内存泄漏。智能指针的主要作用就是利用栈智能指针离开作用域的时候调用析构函数释放资源。下面我们介绍四类智能指针auto_ptrauto_ptr是C++...原创 2019-08-25 13:05:18 · 278 阅读 · 0 评论 -
浅拷贝,深拷贝,写时拷贝
浅拷贝思想:我们用指针p申请了一块内存空间,在用指针q指向了这一片内存空间,这时候这两个指针指向的是同一个内存空间,当需要释放这块内存空间的时候p会释放一次,q也会释放一次,这样重复释放就会引发程序的崩溃。我们通过一段代码来理解浅拷贝class Person{public: char* name; int age; ~Person() { if (name != NU...原创 2019-08-21 20:55:52 · 115 阅读 · 0 评论 -
红黑树和AVL树的比较
红黑树和AVL树都是从二叉搜索树进化而来的平衡二叉树。AVL树的特点一个节点的左右子数的高度差不大于1 一个节点的左右子数都是平衡二叉树 平衡二叉树满足二叉树所有的特点AVL树的时间复杂度一颗n个结点的AVL树的平均搜索复杂度是O(logn) 一颗n个结点的AVL树删除一个结点做平衡旋转的时间复杂度是O(logn) 一颗n个结点的AVL树插入一个结点做平衡旋转的时间复杂度是O...原创 2019-08-29 22:29:14 · 1817 阅读 · 1 评论 -
常见排序算法的使用场景和时间复杂度
排序算法的思想冒泡排序思想:从第一个待排序的数开始,和相邻的数两两比较,如果是由小到大的话就和遇到的小的交换,然后继续和后面的比较,直到所有的数据都有序,这样的话最大的数就会浮现到后面去。就像喝汽水时气泡上升的过程。时间复杂度:O(n^2) 最好的时间复杂度O(n) 空间复杂度:O(1)稳定性:稳定查看代码请点下面链接https://blog.csdn.net/ch...原创 2019-08-30 14:17:47 · 788 阅读 · 0 评论 -
c++和c的区别
1.函数参数的默认值c++参数默认值的赋值必须从右向左,依次赋默认值函数参数的默认值不可以重复赋值当main函数编译生成指令之后,其他文件中修改某一参数不会造成影响,只有在同一文件中重复赋值才会出错下面是具体的示例代码:#include<iostream>using namespace std;//int fun(int a= 100, int b ,...原创 2018-11-05 17:42:40 · 124 阅读 · 0 评论 -
c和c++的区别之const
1.constC++:在c++中,const定义的是常量,该常量的值是不可以被修改的,编译时期该使用该常量的地方直接替换成该常量的值,当然,常量是必须初始化的。因为编译时期,使用该常量的地方必须替换成该常量的值,若没有初始化,则此常量就是无用的常量const修饰的数据产生的符号是local的,因为在编译时期就会替换常量的值,此过程只在本文件中进行,外文件是无法解析此文件的常量...原创 2018-11-07 12:53:31 · 141 阅读 · 0 评论 -
虚函数,虚继承,纯函数继承
覆盖覆盖就是子类会覆盖与父类相同的虚函数,下来看一个覆盖的代码:class A{public: void virtual f() { cout << "A" << endl; }};class B :public A{public: void virtual f() { cout << "B" << endl...原创 2019-04-23 20:50:49 · 424 阅读 · 0 评论 -
迭代器失效
序列式迭代器失效迭代器是我们日常写代码时经常用到的,下面我们就定义迭代器vector<int>::iterator it;;cout << sizeof(it) << endl;迭代器可以理解为我们对其的指针的操作,这就可以把it理解为一个指针,但是指针在32位机器上是占4个字节,在64位机器上占8个字节,“迭代器指针”不是4个也不是8个而是12...原创 2019-04-19 20:09:36 · 96 阅读 · 0 评论 -
三类工厂模式分析
简单工厂模式简单工厂模式是工厂模式里面最简单的模式,它定义了一个创建对象的类,由这个类来封装实例化对象的行为。再简单一点来说就是实现了生成产品类的代码和客户端代码分离,在工厂类中你可以添加所需的生成产品的代码。产品的共同接口:package factory;public interface Product { //声明类所需继承的共同接口,也可以是抽象类}产品类A...原创 2019-03-21 22:20:11 · 141 阅读 · 0 评论 -
单例模式的多种实现
单例模式单例模式:在我们平时写代码的时候会遇到这样一个问题,一个类只能有一个对象被实例化,这时候我们就需要用到单利模式了。单例模式限制了类实例的创建,我们保证了一个实例,所以我们还需要提供访问该实例的全局访问。所以单例类具有一下几个公共特点:单例类的构造函数必须写在类的private里面 单例类拥有一个保存类的实例对象的静态成员变量 单例类拥有一个访问这个实例对象的公共的静态方法单例...原创 2019-03-19 17:31:05 · 119 阅读 · 0 评论 -
C和C++的区别(全)
重载函数符号的生成规则C 只和函数名有关系C++ 函数原型有关: 1.函数名 2.参数类型 3.参数顺序:参数个数,参数类型,参数顺序重载3要素:1.同名 2.参数不同 3.同作用域详细可见https://blog.csdn.net/choudan8888/article/details/83751418new/malloc 的区别 1.ne...原创 2019-07-22 18:35:57 · 169 阅读 · 0 评论 -
栈和堆的区别
栈栈的特性:先进后出,主要为一个线程独享,为这个线程的函数的调用服务的。用于存放返回地址,零时变量个参数而用。栈的内存一般都是由编译器自己来分配释放的,编译器所分配的内存是连续的,当定义一个变量的时候,在当前栈区的尾部来分配心的变量的内存。在windows系统里面栈的大小是2M,在linux系统里面栈的大小是8M,可以使用ulimit-s来设置栈的大小。栈的空间的分配是由高地址向低地址分配的。...原创 2019-03-13 18:54:26 · 7403 阅读 · 0 评论 -
static在C++和C语言中的区别
C语言中:静态局部变量和普通局部变量他们的主要区别是作用域不同,静态局部变量的作用域是它当前的文件,其他文件是不可以访问的。多人联合开发是不会担心变量名冲突。而普通全局变量的作用域是当前整个工程的的,不同文件可以共享全局变量。 存储的位置不同,静态局部变量被static修饰其生命周期是整个源文件,静态局部变量存储在静态存储区。因为其生命周期是全局的,所以对其初始化只会执行一次。普通的局部变量...原创 2019-03-12 18:00:30 · 363 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。思路:把长度为n的输入序列分为两个长度为n/2的的序列 对这两个子序列分别采用归并排序 将两个排好序的子序列合并成一个最终的排序序列时间复杂度:最好:O(nlogn) 最坏:O(nlogn) 平均:O(nlogn)空间复杂度:O(n)非递归代码如下:void Meger(int *...原创 2019-03-12 14:54:45 · 102 阅读 · 0 评论 -
继承与多态的相关题目
1.派生类内存布局,继承了基类什么东西?先是基类,后是派生类,并且继承了名字作用域和除析构构造之外的所有方法2. 类的编译程顺序,构造顺序,析构顺序类的编译程序:先编译类名->成员名->方法体子类的构造顺序:先构造父类,在构造子类子类的析构顺序:先析构子类,后析构父类,即先构造的后析构,后构造的先析构3.基类派生类同名成员之间的关系重载:重载是指同一个类中的...原创 2019-01-27 22:22:57 · 307 阅读 · 0 评论 -
指针和引用的区别
1. 指针是一个变量,这个变量之中存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量是一个东西,是原来变量的别名;int main(){ int a = 10; int b = 20; int *p = &a; int &q = b; cout << q << endl; cout << *p << en...原创 2019-01-21 19:37:33 · 86 阅读 · 0 评论 -
继承和多态基础
继承1.什么是继承?继承就是当我们定义一个新的class类的时候,可以从某个现有的class类继承,新的class类称为子类,而被继承的class类称为基类或者父类。下面我们用代码看一下什么叫继承#include <iostream>#include<string>using namespace std;class Animal{public:...原创 2019-01-18 20:45:50 · 470 阅读 · 0 评论 -
智能指针
1. 什么是智能指针?智能指针是存储指向动态内存分配的,在类的构造是传入一个指针,在析构是释放指针。智能指针面对异常时格外有用,它们能够正确的销毁动分配的对象,2.为什么要使用智能指针?我们会经常遇到一下问题:void fun(int *p){ *p = 5; cout << *p << endl; delete p;}int main()...原创 2019-01-11 21:41:10 · 120 阅读 · 0 评论 -
字符串数组和指针指向的字符串的区别
C和C++中,字符串都以'\0'结尾,这样我们就能很方便的找到字符串的尾部,但由于这个问题,每个字符串都有一个额外字符的开销,稍不留神就会造成字符串的越界。例入下面的代码:int main(){ char s[10]; char a[] = "0123456789"; strcpy(s, a); cout << s << endl; return 0;...原创 2019-01-11 16:29:36 · 592 阅读 · 0 评论 -
C++面向对象(基础)
1.构造函数用例实例化对象的时候调用的成员方法:构造函数没有返回值,函数名与类名同名,参数没有规定(根据需要)实例化对象的时候必须调用构造函数一旦自己内有实现构造函数,编译器就会为我们自动默认生成一个构造函数默认的构造函数就是没有参数的构造函数示例如下:class Person{private: char *_name; bool _sex; int _age...原创 2018-11-12 18:31:27 · 125 阅读 · 0 评论 -
C和C++的区别之动态内存申请
C语言中:申请内存空间的头文件是#include <malloc.h>,最重要的是不要忘记释放申请的内存空间,防止内存泄漏申请一个结点的内存空间#include <stdio.h>#include <malloc.h>#include <assert.h>int main(){ int *p = (int *)malloc(...原创 2018-11-12 15:49:12 · 396 阅读 · 0 评论 -
C和C++的区别之引用 "&"
引用:相当于变量的别名,对引用的操作与直接操作变量一样void swap(int *const a, int *const b){ int c = 10; a = &c; //对引用的操作和对变量的操作一样 int tmp = *a; *a = *b; *b = tmp;}//引用相当于变量的别名void swap(int &a, int &...原创 2018-11-08 21:42:56 · 228 阅读 · 0 评论 -
关于全排列的问题
看下面一个例子给出一个数组 1 2 3列出所有的全排列 1 2 31 3 22 1 32 3 13 2 1 3 1 2这就是全排列思路:T=【x1,x2,x3,x4,x5,……..xn−1,xn】我们获得了在第一个位置上的所有情况之后(注:是所有的情况),对每一种情况,抽去序列T中的第一个位置,那么对于剩下的序列可以看成是一个全新的序列T1=【x2,x3,x...原创 2019-07-24 20:28:54 · 171 阅读 · 0 评论