C++
不爱吃药的少爷、
天大地大,从不缺少好听的故事
展开
-
二维数组中的查找
在一个 n * m的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回 tru.原创 2020-07-09 21:40:50 · 107 阅读 · 0 评论 -
请实现一个函数,把字符串 s 中的每个空格替换成“%20“
请实现一个函数,把字符串 s 中的每个空格替换成"%20"示例:输入:s = "We are happy."输出:"We%20are%20happy."功能实现class Solution {public: string replaceSpace(string s) { string::iterator it = s.begin(); while (it != s.end()) { if (*it == ' ') { s.erase(it); s.i原创 2020-07-09 13:48:29 · 634 阅读 · 0 评论 -
在一个长度为 n 的数组里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
在一个长度为 n 的数组里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 功能实现class Solution {public: int findRepeatNumber(vector<int>& nums) { vector<int> num(nums.size(),0);原创 2020-07-08 19:08:32 · 878 阅读 · 0 评论 -
合并两个有序升序的整数数组A和B变成一个新的数组。新数组也要有序。
合并两个有序升序的整数数组A和B变成一个新的数组。新数组也要有序样例 1:输入: A=[1], B=[1]输出:[1,1] 样例解释: 返回合并后的数组样例 2:输入: A=[1,2,3,4], B=[2,4,5,6]输出: [1,2,2,3,4,4,5,6] 样例解释: 返回合并后的数组。第一种方法功能实现class Solution {public: vector<int> mergeSortedArray(vector<int> &原创 2020-07-07 12:16:09 · 571 阅读 · 0 评论 -
计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值
计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值样例样例 1:输入:k = 1, n = 1输出:1解释:在 [0, 1] 中,我们发现 1 出现了 1 次 (1)。样例 2:输入:k = 1, n = 12输出:5解释:在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 中,我们发现 1 出现了 5 次 (1, 10, 11, 12)(注意11中有两个1)。功能实现class Solution {publi原创 2020-07-05 19:09:37 · 298 阅读 · 0 评论 -
设计一个算法,计算出n阶乘中尾部零的个数
设计一个算法,计算出n阶乘中尾部零的个数样例 1:输入: 11输出: 2样例解释: 11! = 39916800, 结尾的0有2个。样例 2:输入: 5输出: 1样例解释: 5! = 120, 结尾的0有1个。class Solution{public: long long trailingZeros(long long n) { int temp = multi(n); int count = 0; while((temp % 10) == 0) {原创 2020-07-03 23:26:34 · 153 阅读 · 0 评论 -
C++的模板(二)类模板示例三:(栈实现)将输入的一个数(十进制)以任意进制(二进制、八进制、十六进制)输出
#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;template <typename T>class Stack{private: int size; int max_size; T *tp;public: Stack(int size){ max_size=size; tp=new T[size]; this->原创 2020-06-29 20:17:07 · 425 阅读 · 0 评论 -
C++的模板(二)类模板示例二:向栈中写入数据,再打印出来
栈的特点:后进先出template <typename T>class Stack{private: int size; int max_size; T *tp;public: Stack(int size=10){ max_size=size; tp=new T[size]; this->size=0; } ~Stack(){ delete tp; } T push(T dat){ if(size==max_size){ prin原创 2020-06-29 20:09:48 · 136 阅读 · 0 评论 -
C++的模板(二)类模板示例一:(队列实现)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡是报到3的人退出圈子,问最后留下来的是原来的第几位
类模板C++除了支持函数模板,还支持类模板,此时类模板中定义的类型参数可以用在类声明和类实现中,类模板的目的同样是将数据的类型参数化原创 2020-06-29 19:50:41 · 649 阅读 · 0 评论 -
C++的模板(一)函数模板
函数模板1、建立一个通用函数,不过其函数类型和形参类型不具体指定,用一个虚拟的类型的来代表,这样的函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不需要定义多个函数,只需要在模板中定义一次就可以了2、在函数模板中,数据的值和类型都被参数化了,在函数调用时编译器会根据传入的实参来推演形参的值和类型3、模板的使用格式如下4、模板没有被使用时,是不会被实例化出来的5、一般讲模板的声明和实现声明和实现放在.hpp文件中6、模板的声明和实现分离到.h和.cpp,会导致链接错误先看下.原创 2020-06-28 10:59:50 · 110 阅读 · 0 评论 -
C++的运算符重载(二)加号、减号、复制、加等于、等于、不等于、负号、 左移、右移、前置++、后置++等的重载
首先讲下 a++ 和 ++a 的区别a++是先取值后运算,++a是先运算后取值#include <iostream>using namespace std;class Point {private: int m_x; int m_y;public: Point(){} Point(int x,int y):m_x(x),m_y(y){} void Display(){ cout << "(" << m_x << "," &l..原创 2020-06-26 21:20:45 · 4426 阅读 · 0 评论 -
C++的运算符重载(一)运算符重载的定义及注意事项
运算符重载(操作符重载)1、根据用户的需求,可以为运算符增加一些新的功能,赋予新的含义2、运算符重载的格式3、并不是所以的运算符都可以实现重载4、有些运算符只能重载为成员函数 ,例如=、[ ]、()、->5、运算符重载函数可以是类的成员函数,由于类的普通成员函数本身就有一个指向对象的指针this所以单目运算符不需要参数,双目运算符的参数只有一个。也可以是全局函数(一般需要在类中声明该函数为友元函数)6、运算符重载函数不能用默认参数,否则会改变运算操作符的个数7、运算符重载不会改变原来.原创 2020-06-26 15:34:05 · 2022 阅读 · 0 评论 -
C++的纯虚函数和抽象类示例:创建一个动态数组,可以实现增加、删除、查找、计算长度、打印等功能
创建一个动态数组,可以实现增加、删除、查找、计算长度、打印等功能#include <iostream>#include <cstdio>using namespace std;class List{public: virtual void add(int dat)=0; virtual int get(int index)=0; virtual int size()=0; virtual void display()=0; virtual int remove原创 2020-06-25 22:23:31 · 408 阅读 · 0 评论 -
C++的继承和派生(五)纯虚函数和抽象类
在上一篇提到了虚函数,可以发现,虚函数并没有实现相应的功能,只是提供了类似于接口的功能。所以在C++中可以将虚函数声明为纯虚函数,其语法格式为:virtual 返回值类型 函数名 (函数参数)=0;说明:1、纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上 “=0”,表明此函数是纯虚函数2、包含纯虚函数的类称为抽象类,抽象类无法创建对象3、抽象类也可以包含非纯虚函数、成员变量4、如果父类是抽象类,子类没有完全重写纯虚函数,那么这个子类依然是纯虚函数5、只有类中的虚函数才可以被定义为虚原创 2020-06-25 20:53:33 · 437 阅读 · 0 评论 -
C++的继承和派生(四)多态的实现和虚函数
C++的多态有四种:1、强制多态:函数重载和运算符重载(后面讲解)2、强制多态:强制类型转换3、包含多态:利用虚函数实现,在子类中重写函数,实现动态绑定4、参数多态:与类模板相关联(后面讲解)本篇所要讲解的是包含多态,由于是在继承的基础上实现的,所以就干脆放在继承和派生这一专题了在介绍多态前,请看下面一段代码class Dog {public: void run() { cout << "Dog-run()" << endl; } void sp..原创 2020-06-25 18:01:37 · 234 阅读 · 0 评论 -
C++的继承和派生(三)虚继承和虚基类、虚继承时的构造函数
虚继承和虚基类的概念多继承多继承是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的所有的成员,但是多继承很容易造成命名冲突的问题,例如典型的菱形继承如上图所示,假设当类A中有一个成员变量a,那么在D类中直接访问就会产生歧义,因为编译器不知道成员变量 a 的来源途径是什么(A→B→D还是A→C→D)。不仅如此,类A在类D 中存在两份数据,那么构造D类的对象时,就必须对这两份数据经行初始化,此时来A 的构造函数就会调用两次。为了解决多继承时的成员冗余、重复和命名冲突的问题,C++提原创 2020-06-25 15:34:10 · 684 阅读 · 0 评论 -
C++的继承和派生(二)派生类的构造函数和析构函数
标题原创 2020-06-25 13:26:28 · 539 阅读 · 0 评论 -
C++的继承和派生(一)父类和派生类(子类)的介绍以及派生类的访问控制
在介绍继承和派生之前,先看下面一段代码在这里插入代码片原创 2020-06-24 23:35:29 · 9460 阅读 · 0 评论 -
C++的静态成员变量和静态成员函数和static关键字
静态成员变量静态成员变量:被 static 修饰的成员变量叫做静态成员变量1、静态成员变量存储在数据段(全局区,类似于全局变量),整个程序运行过程中只有一份内存2、对比于全局变量,它可以设定访问权限(public、protected、private),以达到数据共享的目的3、静态成员变量必须要在类外初始化(没有初始化则不能使用),初始化不能加static,但需要加上类名4、可以通过(对象.静态成员)、(对象指针.静态成员)、(类名::静态成员)来访问。通过不同对象访问时,访问的都是同一块内存原创 2020-06-23 21:50:23 · 211 阅读 · 0 评论 -
C++的友元函数和友元类
友元包括友元函数和又元类友元函数在类外定义的函数,可以在在类内进行声明,但要在前面加上关键字friend,这样就构成了友元函数友元函数可以是不属于任何类的成员函数,也可以是其他类的成员函数友元函数可以访当前类中的所有成员(private、public、protected)友元函数会破坏面向对象的封装性,但是在某些频繁访问成员变量的地方可以提高性能-------------------------------------------将两个点相加-------------------------原创 2020-06-23 18:56:58 · 105 阅读 · 0 评论 -
C++的构造函数和析构函数(六)浅拷贝和深拷贝
浅拷贝编译器默认的提供的拷贝就是浅拷贝1、将一个对象的中的所有成员变量的值拷贝到另一个对象(上一篇博客)2、如果某个成员变量是个指针,只会拷贝指针中存储的地址值,并不会拷贝指针指向的内存空间3、可能会导致堆空间多次free的问题深拷贝当类中有指针类型时,此时需要进行深拷贝,这时就要自定义拷贝构造函数将指针类型的成员所指向的内存空间拷贝到新的内存空间,也就是进行堆上的空间复制浅拷贝程序分析class Student { int m_age; char *m_name;pub原创 2020-06-23 16:22:51 · 232 阅读 · 0 评论 -
C++的构造函数和析构函数(五)拷贝构造函数和默认构造函数
拷贝构造函数拷贝构造函数是构造函数的一种拷贝构造函数的格式是固定的,接收一个const引用作为参数当利用已存在的对象创建一个新对象时(类似于拷贝),就会调用新对象的拷贝构造函数进行初始化class Person{public: int m_age; int m_height; //构造函数 Person(int age,int height):m_age(age),m_height(height){ cout << "构造函数被调用" <<endl; }原创 2020-06-23 13:48:43 · 221 阅读 · 0 评论 -
C++的构造函数和析构函数(四)析构函数
析构函数我们都知道,创建对象时系统会调用构造函数来进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,比如释放分配的内存、关闭打开的文件等,这个函数就是析构函数特点1、函数名以~开头,与类同名,无返回值,无参2、不可以重载,有且只有一个析构函数3、由malloc 分匹配的对象free时不会调用析构函数4、构造函数、析构函数要声明为public才能够被外界正常使用class Person{public: int m_age;};class Student {p原创 2020-06-23 10:51:21 · 90 阅读 · 0 评论 -
C++的构造函数和析构函数(三)构造函数参数初始化列表
构造函数参数初始化列表C++中提供了一种新的初始化成员变量的方法,那就是对象初始化列表;使用方法是在函数首部和函数体之间加一冒号,后面紧跟要初始化的参数,如下所示class Test {public: int m_a; int m_b; Test(int a, int b) :m_a(a), m_b(b) { }};上面的代码与下面两种写法等价class Test {public: int m_a; int m_b; Test(int a, int b){ this-原创 2020-06-23 00:52:10 · 577 阅读 · 0 评论 -
C++的构造函数和析构函数(二)默认情况下成员变量的初始化
默认情况下成员变量的初始化首先,我们都知道成员变量的可以在全局区、栈区、堆区,那么他们在默认情况下会不会被初始化呢?其实通过上一篇博客程序的运行结果也能够看出一点了,在这里在做一个总结class Person {public: int m_age;};//全局区Person g_p1; //成员变量不会被初始化int main() { //栈区 Person z_p1; //成员变量不会被初始化 //堆空间 Person *d_p1 = new Person; //成员原创 2020-06-22 22:54:58 · 410 阅读 · 0 评论 -
C++的构造函数和析构函数(一)构造函数及其调用
在接下来的几篇博客中,我将详细的介绍 C++ 的构造函数和析构函数构造函数什么叫叫构造函数:函数名与类同名,没有返回值,在创建对象时自动调用,这种特殊的函数就是构造函数,构造函数包括 无参构造函数 和 有参构造函数构造函数的特点1、没有返回值(void都不能写)2、可以有参数、可以重载、可以有多个构造函数3、一旦自定义了构造函数,必须使用其中一个自定义的构造函数来初始化对象4、注意:通过malloc分配的对象不会调用构造函数(这也是new和malloc的区别)为什么要使用构造原创 2020-06-22 21:54:02 · 209 阅读 · 0 评论 -
Elipse快捷键
分享一波个人常用的一些 Elipse 快捷键,如果你觉的有用的话,记得要收藏哦!!!1、Ctrl+1 快速修复2、Ctrl+D 删除当前行3、Ctrl+L 定位到某行4、Ctrl+/ 注释当前行,再按就取消注释5、Ctrl+Q 定位到最后编辑的地方6、Ctrl+H 打开文件搜索对话框7、Ctrl+f 全局寻找,全局替换8、Ctrl+d:删除当前行9、alt+? 或 alt+/:自动补全代码或者提示代码10、Ctrl+m:当前编辑页面窗口最大化11、Ctrl+/:自动注释当前行原创 2020-06-22 15:48:45 · 154 阅读 · 0 评论 -
如何理解C++中的封装
我们都知道,C++是面向对象的一门语言,而封装是面向对象程序设计的特点之一(除此之外还有继承和多态)那到底什么什么时封装呢?在我的第一篇博客中就提到了私有化和公有化(这里不再赘述)。当成员变量私有化,此时类外就不能对其进行访问,所以需要提供公共的setter方法和getter方法给外界去访问成员变量请看下面的代码:...原创 2020-06-22 13:50:51 · 578 阅读 · 0 评论 -
如何理解C++中的this指针
this指针1、this是指向当前对象的指针,他只能在一个类的成员函数中调用,他表示当前对象的地址2、this在成员函数的开始前构造的,在成员结束后清除,他的生命周期与函数的参数是一样的。当调用一个类的成员函数时,编译器会将类的指针作为函数的this参数传进去3、this指针可能存放在栈区,也可能在寄存器中、甚至是全局变量4、通过this指针访问成员变量时,要有this -> 成员变量class Person{public: int m_age; int m_height; vo原创 2020-06-22 11:51:01 · 391 阅读 · 0 评论 -
内联函数、const、引用 的含义和用法
内联函数说明:1、使用inline修饰函数或者申明实现,可以使其变成内联函数2、建议声名和实现都增加inline修饰3、在声名内联函数时,关键字inline必须和函数定义结合在一起,否则编译器会直接忽略内敛请求特点:1、编译器会将函数调用直接展开为函数替代码2、可以减少函数调用的开销3、会增加代码的体积限制1、不能存在任何形式的循环语句或者过多的条件判断语句2、不能对函数进行取址操作3、函数内联声名必须在调用语句之前什么时候使用内联函数1、函数代码体积不大2、频繁的调用函数补原创 2020-06-22 11:21:14 · 322 阅读 · 0 评论 -
内存空间的布局(栈区、堆区、代码区、全局区)以及堆空间的初始化
标题内存空间的布局(栈区、堆区、代码区、全局区)以及堆空间的初始化代码区(代码段):用于存放代码全局区(数据段):用于存放全局变量等栈区:当调用一个函数时,系统就会给他分配一段连续的栈空间,等函数调用 完毕后就会自动回收这段栈空间堆区:需要主动的去申请和释放为什么要引入堆区呢?在程序运行过程中,为了能够自由地控制内存的生命周期、大小,会经常使用堆空间的内存。当我们需要的时候就可以向堆区申请,但是需要手动释放下面重点讲讲堆区堆空间的申请和释放:mall原创 2020-06-21 22:52:03 · 836 阅读 · 0 评论 -
如何让理解C++中的函数重载和C++函数的默认参数。函数重载的二义性怎么产生的?
标题如何让理解C++中的函数重载和C++函数的默认参数。函数重载的二义性怎么产生的?函数重载:条件:1、函数名相同2、函数参数个数不同、参数类型不同、参数的顺序不同注意事项:1、返回值类型与函数重载无关2、实参的隐式类型转换可能会产生二义性(这个会在下面的代码中体现)默认参数定义:在C++中,定义函数时可以给形参指定一个默认的值,此时在调用这个函数时没有给这个形参赋值(没有对应的实参),那么就是使用这个默认的值,也就是说在调用函数时可以省略有默认值的参数。注意事项:1、默认参数只能按原创 2020-06-21 20:52:18 · 191 阅读 · 0 评论 -
C++中的class和struct的区别?如何理解类中的对象以及如何访问?
标题:C++中的class和struct区别在吗?如何理解类中的对象以及如何访问?理解:在C语言中,struct为结构体,他是一种结构类型,可以包含若干成员变量,每个成员变量的类型也可以不同。但是在C++中,对该结构类型进行了一些扩展,我们称之为类,而此时类中的成员也可以是函数。而用类定义的变量就称之为对象。在C++中,都可以用struct和class来定义一个类。区别在C++中可以使用struct和class来定义一个类;其中struct的默认成员权限是pcblic(公有化),而class的默认成原创 2020-06-19 20:51:25 · 296 阅读 · 0 评论