C++
文章平均质量分 65
董HaoYu
这个作者很懒,什么都没留下…
展开
-
C++中vector容器为什么扩容时按照2倍或者1.5倍进行扩容
扩容机制首先在VS2013底下,vector的扩容操作是每次扩容*1.5;在GCC环境下是2倍。GCC下的扩容方式是以二倍形式扩容。VS2013下是以1.5倍进行扩容所以可能会有疑问:问题一:为什么非要以倍数的形式增长,而不是以个数的形式增长。问题二:为什么每次增长是1.5倍或者2倍形式,而不是3倍或者4倍形式增长。详解问题一倍数方式空间拷贝数据次数假设总共有n个元素,以...原创 2020-03-26 22:47:56 · 4623 阅读 · 1 评论 -
stringstream的用法
stringstream概述头文件:< sstream >继承自:< iostream>自身的成员函数:构造, rdbuf, strstr:将缓冲区中的数据以string的形式转换。返回值为string。继承的主要使用的成员函数[>>]:继承自istream,可以向sstream中输入数据。[<<]:可以向某些变量里输出数据。...原创 2020-03-21 19:06:42 · 883 阅读 · 0 评论 -
线程池和多线程的区别
线程池的概念线程池大类总共分为4种fixThreadPool 正规线程(传统线程池)cacheThreadPool 缓存线程池singleThreadPoll 单线程线程池(单例线程池)ScheduledThreadPoll 周期性执行任务的线程池fixThreadPool 正规线程(传统线程池)含有核心线程,核心线程即为最大线程数量,没有非核心线程cacheThr...原创 2020-03-17 17:44:50 · 8549 阅读 · 0 评论 -
快速排序的四种优化方式
快速排序的四种优化方式本文只讲述概念。选用基准值(不在四种优化方式中)选用基准值有三种方式,选用的基准值较好,快速排序的性能也会较好。固定基准(也就是从begin的位置,作为排序的基准,没有一点优化,简单的快排方式都是这样)随机基准(和固定基准差不多)三数取中,这个基准就稍微优化了一些,从一堆数据中随机找出三个数据,把中间数据作为基准值,可以说是进行了稍微的优化。下面讲一下四种优...原创 2020-03-16 23:33:44 · 1913 阅读 · 1 评论 -
switch和if else效率
switch case 与 if elseswitch case会生成一个跳转表来指示实际的case分支的地址,这个跳转表的索引号于switch变量的值相等。而 if else是需要顺序的遍历条件,直到条件成立。switch case 的优缺点优点:在效率上:当分支较多时,switch的效率是很高的。因为swtich在确定了选择值之后,会直接跳转到那个特定的分支。缺点:switc...原创 2020-03-13 14:03:06 · 473 阅读 · 0 评论 -
C++异常的种类
概述C++中的异常是以继承的方式展现出来的,exception只是一个抽象类,通过虚函数的方式来进行继承,可以达到C++多态的效果。直接可以使用父类指针或者引用来捕获异常。详细介绍bad_typeid在使用typeid运算符时,如果其操作数是一个多态类型的指针,而该指针的值为NULL时,则会抛出异常。#include<iostream>#include<typein...原创 2020-03-08 23:26:28 · 2556 阅读 · 0 评论 -
AVL树的旋转(二叉平衡树)
概念二叉搜索树概念:https://blog.csdn.net/weixin_43796685/article/details/104345502AVL树代码:https://github.com/DHaoYu/C-Cplusplus/tree/master/C%2B%2B/%E4%BA%8C%E5%8F%89%E6%A0%91/%E4%BA%8C%E5%8F%89%E6%A0%91由于二...原创 2020-03-02 23:26:27 · 261 阅读 · 0 评论 -
哈希表的开散列和闭散列(C++实现)
hash概念哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。搜索方法:可以进行少量的比较,1次或者2-3次从数据中得到要搜索的数据,是大量数据的搜索时间复杂度变成O(1)。哈希函数hashfunc可以通过哈希函数与存储表中的元素建立一亿映射的关系,可以通过此函数直接查找到该数据在哈希表中的位置。插入元素...原创 2020-02-27 17:00:07 · 1096 阅读 · 0 评论 -
排序算法的性能测试
注:这几种排序函数本人并没有加以优化,只是简单的将其给出,做一个简单的数据测试,所以当然不如库函数的效率。测试平台时Win10系统,VS2013,没存8G, CPU i5 7300所有数据都是本人亲测,代码链接:测试代码//sort_test310个数据100个数据发现选择排序和冒泡排序已经从0毫秒变成1毫秒1000个数据此时,发现插入排序,冒泡排序,选择排序的性能相对较差了。...原创 2020-02-23 23:17:25 · 400 阅读 · 0 评论 -
STL中sort排序分析
本人写的快排排序与algorithm中快排的效率比较我就纳闷了,快速排序已经是很快的排序算法了,为什么还和库中的排序算法相差如此之远。查阅网上资料与库中的源码得知在库中的排序算法不光光使用到了快速排序,并且使用到了多种排序相结合的方式,控制着整个排序中序列的大小与排序方式的进行。首先 STL中sort函数使用了三种排序手法,分别是快速排序,堆排序,插入排序三种方式,并且快速排序采用递归...原创 2020-02-22 22:24:40 · 316 阅读 · 0 评论 -
七大排序算法总结
排序算法分类类型排序名称排序名称插入排序类型直接插入排序希尔排序选择排序类型选择排序堆排序交换排序类型冒泡排序快速排序归并排序类型归并排序性能—时间复杂度&空间复杂度排序方法平均时间复杂度最好情况最差情况辅助空间稳定性插入排序O(n^2)O(n)O(n^2)O(1)稳定冒泡排序O...原创 2020-02-21 16:41:26 · 205 阅读 · 3 评论 -
图解二叉搜索树(C++)
二叉搜索树定义二叉搜索树(二叉排序树)可以是一颗空树(无结点)也可以:若它的左子树不空,则左子树上的所有结点都小于其根节点的值若它的右子树不空,则右子树上的所有结点都大于其根节点的值它的左右子树分别也必须是二叉搜索树如图:最左边的值一定是最小值,最右边的值一定是最大值结点结构template<class T> //模板参数struct BSTNode{ B...原创 2020-02-16 22:19:12 · 163 阅读 · 0 评论 -
智能指针循环引用图解秒懂
智能指针shared_ptr实现一个简单的shared_ptr类#include<iostream>#include<mutex> //仿函数template<class T>class DFDel{public: void operator()(T*& p) { if (p) { delete p; p = n...原创 2020-02-13 17:26:27 · 1271 阅读 · 1 评论 -
C++多态(五)---菱形继承中的虚函数表详解
C++多态菱形继承虚基表指针与虚基表我们知道,在虚继承(菱形继承)中,对于类D创建的对象d,为了避免A类中的变量重复,所以,将A类中成员变量放在d对象模型的最下面,由B类与C类各自虚基表指针访问虚基表中偏移量的方式进行访问A类成员变量。虚函数表指针与虚函数表(虚表)在类中成员函数实现多态时,需要将成员函数定义为虚函数,所以,在多态的情景下,单继承下会存在一个虚函数表指针,指向成员函数...原创 2019-12-28 11:54:49 · 3251 阅读 · 3 评论 -
C++多态(四)---虚函数表详解
C++多态在C++多态(三)中已经得知,虚函数表地址存放在对象的内存模型中,通过该指针(vfptr),可以访问到该对象的虚函数表。class Base{public: virtual void f(){ cout << "Base::f()" << endl; } virtual void g(){ cout << "Base::g()" <&...原创 2019-12-26 17:11:11 · 297 阅读 · 1 评论 -
C++多态(三)---多态的原理
C++多态问题引入求如下代码所占内存数class B{public: virtual void Func() { cout << "Func()" << endl; }private: int _a = 1;};int main(){ cout << sizeof(B) << endl; //8}我们发现,...原创 2019-12-24 00:11:02 · 190 阅读 · 0 评论 -
C++多态(二)---抽象类与C++11新增
C++多态抽象类定义在面向对象的概念中,所有的对象都是通过类来描述的,但是,反过来,并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是一个抽象类。C++中使用纯虚函数的方式来实现抽象类的功能C++实现抽象类方式在纯虚函数的后面跟上=0,则这个函数为纯虚函数。包含纯虚函数的类称之为抽象类(接口类),抽象类不能实例化对象因为抽象类中没有具体的...原创 2019-12-22 00:09:55 · 420 阅读 · 0 评论 -
C++多态(一)---多态的概念
C++多态多态概念通俗来讲,就是一个事物的多种形态当不同对象完成某种行为时,所表现出来的不同种的状态称之为多态多态的定义在面向对象语言中,对于接口的不同实现方式称之为多态。多态性时允许将父类对象设置成为一个或者多个他的子类对象相等的技术一般用指针实现,赋值之后,父类对象可以根据当前赋值给他的子类对象的特性以不同方式进行调用。例子:买票的行为,当普通人进行买票时(调用买票函数时),需要买全...原创 2019-12-20 22:33:29 · 1343 阅读 · 0 评论 -
C++继承(六)---菱形继承中类对象大小
C++多态菱形继承中类对象大小空类大小为1class A{};int main(){ cout << sizeof(A) << endl;}不做处理的情况下继承中类的大小class A{protected: int _a;};class B : public A{protected: int _b;};class C ...原创 2019-12-18 16:35:55 · 906 阅读 · 0 评论 -
C++继承(五)---菱形继承
C++继承菱形继承菱形继承的概念类B、C继承类A, 并且类D在此基础上在继承两个父类B、C这样就构成了一个菱形,故为菱形继承。如下代码所示????class A //基类{ protected: int _a;};class B : public A //B继承A{protected: int _b;};class C : public A //C继承A{prote...原创 2019-12-16 21:31:05 · 470 阅读 · 0 评论 -
C++继承(四)---同名隐藏(重定义)
C++继承多继承与单继承单继承概念一个子类有且只有一个直接的父类时,该继承模式称之为单继承,例子????class A{protected: int _a;};class B : public A{protected: int _b;};class C : public B{protected: int _c;};可以看到,B类有且只有一个父类-----A,所...原创 2019-12-14 22:59:37 · 534 阅读 · 0 评论 -
C++继承(三)---继承中的友元与静态成员
C++继承继承与友元友元关系不能被继承也就是说基类的友元并不能访问子类的私有或者protected成员同理,可知,子类中的友元,也不能访问基类中的protected成员class Derived; //需要进行子类声明class Base{public: friend void print(Base &b, Derived &d); //private 成员...原创 2019-12-10 23:07:08 · 276 阅读 · 0 评论 -
C++继承(二)---继承中的默认成员函数
继承中基类的默认成员函数在继承中,基类的默认成员函数和普通类中的默认成员函数相同。存在6个默认成员函数。派生类中的默认成员函数1.构造函数派生类中的构造函数必须完成基类的构造,如果不进行基类的构造函数,则无法初始化基类部分。class Base{public:private: int _b;};class Derived : public Base{public: /...原创 2019-11-19 00:00:28 · 447 阅读 · 1 评论 -
在一个字符串中找出最长的数字串(python&&C++解法)
在一个字符串中找出最长的数字串(python解法)输入abcd12345ed125ss123456789输出123456789python3import reprint(max(re.findall(r"\d*", input()), key=len))其中findall函数findall函数是正则表达式中的函数将字符串按照一定规则进行匹配,并且返回一个列表,正则表达式用法. #...原创 2019-11-12 17:58:42 · 7046 阅读 · 0 评论 -
C++继承(一)---继承中的访问权限
C++继承继承的概念定义概念继承是面向对象语言中的一个重要方法,不是修改已存在的类,而是在该类的基础上将新的代码加入其中,并且实现之前类中的代码复用也是面向对象七大设计原则之一:组合/聚合复用原则。继承呈现了面向对象语言的层次结构,体系拿了由简单到复杂的认知过程,继承是类设计层次的复用语法格式#include<iostream>using namespace std;...原创 2019-11-12 17:26:19 · 637 阅读 · 0 评论 -
VS2013窗口一闪而过(黑框框)
VS下,运行窗口一闪而过第一个可能性(方法一)在程序运行的末尾加上system("pause");如果不行,请向下????看第二个可能性(方法二)① 首先打开文任意一文件,打开调试---->属性②按照下图操作走,将子系统调为**/SUBSYSTEM:CONSOLE**这样就可以了。如果还是不行(或者想从根本上解决问题),请向下????看解决方法三重新创建一个工程,在创建是直接将选项...原创 2019-11-08 21:38:54 · 3355 阅读 · 0 评论 -
C++内存管理(二)---new和delete详解
C++内存管理方式接C++内存管理(一)来继续阐述new/delete操作内置类型int main(){ int* ptr1 = new int;//动态申请一个int大小的空间 int* ptr2 = new int(5); //将ptr2指针所指向的空间中的值初始化为5 int* ptr3 = new int[4];//动态申请连续的4个int大小的空间 ptr3[1] =...原创 2019-11-06 18:21:26 · 210 阅读 · 1 评论 -
C++内存管理(一)---进程地址空间和物理内存区别
C++内存管理首先强调的一点是:每个进程都认为自己独立的享有着计算机的内存首先虚拟内存与物理内存的区别虚拟内存:程序运行时,会进行一系列的操作,(本章只进行虚拟内存的讲解)进程会构建自己的虚拟地址空间(进程地址空间),该地址空间所有进程都独立的享有一份,如果是32位机器,则会创建2^32(4G)大小的地址空间 ,如果是64位机器,可以创建2^64大小的地址空间(目前所有的程序都没有这么大)...原创 2019-10-31 21:00:23 · 1854 阅读 · 0 评论 -
C++类和对象(七)---C++11新增
C++11新增初始化方面C++11允许非静态成员变量在类内声明时直接进行初始化class B{public: void print() { cout << _a << _b << _c << endl; }private: int _a = 10; char _b = 'A'; double _c = 1.1;};i...原创 2019-10-23 23:55:53 · 166 阅读 · 0 评论 -
C++类和对象(六)---细节方面
细节方面1.构造函数方面初始化列表在构造函数处,以一个冒号开始,接着以逗号分隔数据成员列表,在每一个成员变量后面加上括号,在括号内部使用类似于拷贝构造的方式进行初始化成员变量。class Date{public: Date(int year = 2019, int month = 10, int day = 19)//构造函数 :_year(year)//初始化列表 ,_mo...原创 2019-10-20 00:34:53 · 146 阅读 · 0 评论 -
C++类和对象(五)---六个默认的成员函数
1.类中六个成员函数3.拷贝构造函数拷贝构造函数时一个特殊的成员函数,名字与类名相同,参数只含有一个const修饰的类对象的引用,目的:在创建新对象时将已存在的对象完全拷贝给创建的新对象。只能在实例化对象时调用。class Date{public: Date()//构造函数 { //... } Date(const Date& d)//拷贝构造函数 { _ye...原创 2019-10-09 18:00:51 · 206 阅读 · 0 评论 -
C++类和对象(四)---六个默认的成员函数
1.类中六个成员函数内容class Test{};如上代码所示,如果一个类中什么都没有,则称之为空类,空类中真的什么都没有吗,答案当然是否,那这个空类会生成哪些类内成员?一般情况下,在类中会生成六个默认的成员函数,分别为构造函数,析构函数,拷贝构造函数,赋值运算符重载函数,&运算符重载函数,const修饰的&运算符重载函数。下面进行详细讲解????1.构造函数构造函数...原创 2019-10-07 23:56:14 · 156 阅读 · 0 评论 -
C++类和对象(三)---this指针
1.类对象内存布局形式类对象中的内容来看下面一段代码class T1{public: //构造函数 T1(char c = 'c', int b = 1, double a = 1.0) :_c(c) , _b(b) , _a(a) {} void func()//普通成员函数 { cout << "func()" << endl; }...原创 2019-09-29 00:18:51 · 206 阅读 · 0 评论 -
C++类和对象(二)---内存对齐
1.什么是对象对象的引入(类的实例化)在C++面向对象这门语言中,不仅需要类这种将所有相同事物合并在一起的结构,还需要针对于这个空壳(类)进行创建对象(实例化对象),创建出一个一个的具有这种类属性和方法的单位,就叫做对象。class People{ public: int a; char b;};int main(){ People p1;//p为people类的对象,...原创 2019-09-28 00:05:19 · 319 阅读 · 1 评论 -
C++类和对象(一)---类和作用域
1.什么是类先来了解一下C语言的结构体struct People{ char _name[20];//姓名 int _age;//年龄 char _gender[5];//性别};//C语言中结构体函数只能放在结构体外部我们知道,在C语言的结构体中可以存放变量,但无法直接存放解决一系列相同问题的方法。在C语言结构体中用户只能了解结构体的成员变量,但是随意和时间的发展,人们发现在...原创 2019-09-26 23:49:18 · 1068 阅读 · 1 评论 -
C++ 命名空间以及自定义命名空间
C++命名空间1. C++中的命名空间标准命名空间 namespace stdC++在一般的库文件以及常规操作都需要包含C++标准的命名空间std,用户在使用等头文件时,C++标准把所有的有关stream中的关键字都加上了std的命名空间。所以用户在使用该库文件中的关键字时,需要加上命名空间。使用格式:std::cout<< a << std::endl;//需...原创 2019-09-25 23:06:57 · 5066 阅读 · 0 评论 -
C++名字修饰以及函数重载
C++函数重载------引言想起某一年小品,沈腾出演,其中,较为经典的两句台词,也是比较符合函数重载概念的,今天我就拎出来给大家说说。打败你的不是天真,是无鞋(无邪)这句话在小品中,含义首先是,郝建鞋子掉了,所以说的是无鞋,另一种意思是无邪,在合适的时机,用到合适的场合。要梨不—离!离就离!这句话也能体现出,一个相同的发音,却有着不同的意思,在不一样的场合下,对于相同发音的词,对于...原创 2019-08-07 18:27:22 · 299 阅读 · 0 评论 -
C++关键字(入门)
C++常见关键字C++关键字简单介绍C++98----63个关键字在此选择平时比较常用的关键字解释cout/cin/cerr标准输入cin,通过键盘输入进程序中标准输出cout,将程序运行结果通过显示器输出标准错误cerr,将程序运行中的错误通过显示器输出int a = 10;cin>>a;cout<<a;cerr<<"func";...原创 2019-08-05 19:34:02 · 356 阅读 · 0 评论 -
如何更好的学习C++(初识C++)
如何更好的学习C++什么是C++百度百科 ---- C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。笔者是这么认为的 ---- 随着时代的发展,(就如同一些手机电脑等电子产品...原创 2019-08-05 12:27:18 · 355 阅读 · 0 评论