1 CHheart

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 27w+

特殊类设计

1. 请设计一个类,只能在堆上创建对象实现方式:将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。//只能在堆上创建对象的类// 1. 构造函数私有// 2. 提供一个静态的堆上创建对象的方法// 3. 防拷贝(拷贝构造声明为私有,且不实现, 或者声明为delete函数)class HeapOnly{public: static HeapOnly* getInstance() { //堆上创建对

2020-08-12 14:38:50

智能指针

1. 为什么需要智能指针?避免以下Bug:内存泄露 :对象无法被释放,最常见的问题。野指针 : 指针指向未知。重复释放2. 内存泄漏什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。C/C++程序中

2020-08-10 08:26:10

C++异常

1.C语言传统的处理错误的方式传统的错误处理机制:终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。C 标准库中setjmp和longjmp组合。这个不是很常用,了解一下实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。2. C++异常概念异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时

2020-08-09 09:02:59

哈希的应用

位图所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN位图解决数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如位图的实现class BitM

2020-07-31 10:04:52

哈希表

1. unordered系列关联式容器unordered_mapunordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_ma

2020-07-31 09:51:48

红黑树

红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质每个结点不是红色就是黑色。根节点是黑色的。如果一个节点是红色的,则它的两个孩子结点是黑色的。对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点 。每个叶子结点都是黑色的。红黑树节点的定义enum Color{ BL

2020-07-25 17:51:13

map和set

1.关联式容器关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。2. 键值对用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。3. 树形结构的关联式容器根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset

2020-07-25 17:18:35

二叉搜索树

二叉搜索树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。它的左右子树也分别为二叉搜索树。int a [] = {5,3,4,1,7,8,2,6,0,9};二叉搜索树的查找二叉搜索树的插入a. 树为空,则直接插入b. 树不空,按二叉搜索树性质查找插入位置,插入新节点插入10二叉搜索树的删除首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:a. 要删除的结点无孩子结点b

2020-07-13 09:12:43

多态

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:必须通过基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。虚函数 即被virtual修饰的类成员函数。class Person {pub

2020-07-10 08:50:52

继承

继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(子类),原本的类则称之为基类(父类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。继承及访问权限class Person{public: void Print() { cout << "name:" << _name << endl;

2020-07-10 08:35:04

list用法了解

list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。与其他序列式容器相比,li

2020-06-28 09:18:46

vector

vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到

2020-06-18 15:11:53

string牛刀小试

//找字符串中第一个只出现一次的字符class Solution {public: int firstUniqChar(string s) { // 统计每个字符出现的次数 int count[256] = { 0 }; int size = s.size(); for (int i = 0; i < size; ++i) count[s[i]] += 1; // 按照字符次序从前往后找只出现一次的字符 for (int i = 0; i < size;

2020-06-15 17:24:10

模板初阶

【本节目标】泛型编程函数模板类模板1. 泛型编程泛型编程最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。2. 函数模板函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。函数模板格式template<typename T1, typename T2,…,typename Tn>返回值类型 函数名(参数列表){}tem

2020-06-08 08:32:21

C/C++内存管理

【本节目标】C/C++内存分布C语言中动态内存管理方式C++中动态内存管理operator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)常见面试题1. C/C++内存分布int globalVar = 1;static int staticGlobalVar = 1;void Test(){ static int staticVar = 1; int localVar = 1; int num1[10

2020-06-02 10:25:40

类与对象(下)

【本节目标】再谈构造函数C++11 的成员初始化新玩法。友元static成员内部类再次理解封装1. 再谈构造函数1.1 构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; } private: int _year; int

2020-05-29 16:13:49

类与对象(中)

[本节目标]类的6个默认成员函数构造函数析构函数拷贝构造函数赋值操作符重载const成员函数取地址及const取地址操作符重载1.类的6个默认成员函数2. 构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。构造函数的主要任务并不是开空间创建对象,而是初始化对象。其特征如下:函数名与类名相同。无返回值。对象实例化时编译器自动调用对应的构造函数。构造函数可以重载

2020-05-27 09:42:01

类与对象(上)

[本节目标]1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的作用域5.类的实例化6.类的访问限定符及封装7.类的对象大小的计算8.类成员函数的this指针1.面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2.类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。//C++stru

2020-05-21 09:37:38

C++入门

【本节目标】命名空间C++输入&输出缺省参数函数重载引用内联函数auto关键字基于范围的for循环指针空值—nullptr什么是C++?C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。1.命名空间使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。定义命名空间,需要使用到namespace关键字,后面跟命

2020-05-21 08:48:01

数据结构与算法(5)排序

排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。常见排序算

2020-05-13 10:18:24

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv1
    勤写标兵Lv1
    授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。