笔记
HowDonew
学习过程
展开
-
C++处理字符串输入
stringstream原创 2023-01-16 18:12:16 · 97 阅读 · 0 评论 -
单例模式 懒汉式和饿汉式
其中双检测if(p == nullptr)可以避免每次调用实例方法都进行加锁,如果已经完成实例创建,直接返回创建好的实例即可。其实自己感觉 饿汉式就是getinstance之前创建好了实例,懒汉式就是调用getinstance时再创建实例。饿汉式需要注意的就是需要在getinstance之前必须创建好实例,不然返回的就是一个未定义的实例了。可以使用函数局部静态对象 不用再加锁。饿汉式是初始化的时候已经实例化了。饿汉式 程序运行时就定义了对象。懒汉式就是用到的时候再实例化。...原创 2022-08-03 10:54:52 · 125 阅读 · 0 评论 -
手写智能指针 shared_ptr
解体方法记录原创 2022-07-19 10:17:21 · 239 阅读 · 0 评论 -
KMP C++
KMP详解KMP_CPP代码#include<iostream>#include<string>using namespace std;int* KmpNext(string str) { int* next = new int[str.size()]; next[0] = 0; for (int j = 1, k = 0; j < str.size(); ++j) { while (k > 0 && str[k] != str[j]转载 2021-12-08 21:03:34 · 100 阅读 · 0 评论 -
49 排序方法
1 选择法#include <stdio.h>#include <stdlib.h>/*-------------------- 排序规则 -------------------- 它的工作原理是每一次从待排序的数据元素中选出 最小(或最大)的一个元素,存放在序列的起始位 置,直到全部待排序的数据元素排完。 稳定性:选择排序是不稳定的排序方法 如:[5,5,3]----------------------------------------------原创 2021-10-14 10:54:07 · 123 阅读 · 0 评论 -
48 c++模板库数据结构
1 线性表顺序存储SeqList.h#pragma oncetemplate <typename T>class SeqList{public: SeqList(int capacity); ~SeqList(); // 返回一个线性表list中的元素个数 int get_Length(); int get_Capacity(); // 向一个线性表list的pos位置中插入新元素node int insert(T &t, int pos); // 获原创 2021-10-14 10:52:17 · 182 阅读 · 0 评论 -
47 树Tree
二叉树性质性质1: 在二叉树的第i层上至多有2i-1个结点(i>0)性质2: 深度为k的二叉树至多有2k-1个结点(k>0)性质3: 对于任何一棵二叉树,若2度的结点数有n2个,则叶子数(n0)必定为n2+1 (即n0=n2+1)满二叉树:一棵深度为k 且有2k -1个结点的二叉树。 (特点:每层都“充满”了结点)1 树的表示法1 二叉链// 二叉链表示法/*typedef struct BiTNode { i...原创 2021-09-20 12:41:47 · 87 阅读 · 0 评论 -
46 队列
队列队列是一种特殊的线性表队列仅在线性表的两端进行操作队头(Front):取出数据元素的一端队尾(Rear):插入数据元素的一端队列不允许在中间部位进行操作!队列也是一种特殊的线性表1 队列顺序存储结构seqlist.h#ifndef __MY_SEQLIST_H__#define __MY_SEQLIST_H__typedef void SeqList;typedef void SeqListNode;// 创建并且返回一个空的线性表SeqList* SeqList_Cre原创 2021-09-18 16:46:08 · 103 阅读 · 0 评论 -
45 栈 stack
1 栈的顺序存储结构通过线性表来实现seqlist.h#ifndef __MY_SEQLIST_H__#define __MY_SEQLIST_H__typedef void SeqList;typedef void SeqListNode;// 创建并且返回一个空的线性表SeqList* SeqList_Create(int capacity);// 销毁一个线性表listvoid SeqList_Destory(SeqList* list);// 将一个线性表list中的所原创 2021-09-18 16:45:11 · 70 阅读 · 0 评论 -
44 线性表
O( )表示法 时间复杂度 空间复杂度#include<stdlib.h>#include<stdio.h>#include<string>//算法最终编译成具体的计算机指令//每一个指令,在具体的计算机上运行速度固定//通过具体的n的步骤,就可以推导出算法的复杂度long sum1(int n) //2n+4 ===>O(n) 空间复杂度 O(n){ long ret = 0; //1 4 int* array = (int*)mallo原创 2021-09-05 19:31:56 · 96 阅读 · 0 评论 -
43 STL实例
案例:学校演讲比赛1)某市举行一场演讲比赛,共有24个人参加,按参加顺序设置参赛号。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。2)比赛方式:分组比赛第一轮分为4个小组,根据参赛号顺序依次划分,比如100-105为一组,106-111为第二组,依次类推,每组6个人,每人分别按参赛号顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。 第二轮分为2个小组,每组6人,每个人分别按参赛号顺序演讲。当小组完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。原创 2021-09-05 19:28:00 · 252 阅读 · 0 评论 -
42 STL
1 STL 入门容器内放int等类型#include<iostream>using namespace std;#include <vector>#include<algorithm>void main11() { vector<int> v1; // 1 容器 把元素copy到容器中 v1.push_back(-1); v1.push_back(1); v1.push_back(3); v1.push_back(5); v1.pus原创 2021-09-01 22:14:00 · 111 阅读 · 0 评论 -
41 C++输入输出流
1 标准输入流函数标准输入流对象cin,重点掌握的函数cin.get(一个参数) //读一个字符cin.get(三个参数) //可以读字符串cin.getline()cin.ignore()cin.peek()cin.putback()#include<iostream>using namespace std;//标准输入流对象cin,重点掌握的函数//cin.get() //一次只能读取一个字符//cin.get(一个参数) //读一个字符//cin.get(三个参原创 2021-09-01 22:07:05 · 97 阅读 · 0 评论 -
40 异常
1 异常语法除数是0,抛出异常#include<iostream>using namespace std;// 发生异常之后是跨函数的void divide(int x, int y) { if (y == 0) { throw x; // 抛出int类型异常 } cout << "结果:" << x / y << endl;} void myDiv(int x, int y) { try { divide(x, y); }原创 2021-09-01 22:05:50 · 92 阅读 · 0 评论 -
39 C++类型转换
1 静态类型转换和强制类型转换1 static_cast reinterpret_cast#include<iostream>using namespace std;void main() { double dpi = 3.1415926; int num1 = (int)dpi; //C类型转换 int num2 = static_cast<int>(dpi); //静态类型转换 编译时C++编译器会做类型检查 int num3 = dpi; //C语言中隐式类型原创 2021-08-28 22:03:59 · 112 阅读 · 0 评论 -
38 函数模板和类模板
泛型编程1 函数模板本质:类型参数化产生模板的原因:业务逻辑一样;函数参数类型不一样#include<iostream>using namespace std;//业务逻辑一样//函数参数类型不一样void myswap01(int& a, int& b) { int c = a; a = b; b = c;}void myswap01(char& a, char& b) { char c = a; a = b; b = c;原创 2021-08-27 21:58:08 · 108 阅读 · 0 评论 -
37 C面向接口编程和多态
1 数组指针类型//定义一个数组类型//int a[10];// 定义一个指针数组类型// 定义一个指向数组类型的指针 数组类的指针void main(){ int a[10]; //a代表数组首元素地址 &a代表整个数组的地址 a+1(4) &a+1(40)步长不同 { // 定义数组类型 typedef int(myTypeArray)[10]; myTypeArray myArray; myArray[0] = 10; printf("%d \原创 2021-08-27 21:55:35 · 80 阅读 · 0 评论 -
36 纯虚函数抽象类
定义:在基类中没有定义纯虚函数为各个派生类提供一个公共的界面含有纯虚函数的类叫抽象类1 纯虚函数抽象类#include<iostream>using namespace std;// 解耦合...模块划分class Figure { // 抽象类public: // 约定一个统一的接口让子类必须实现 virtual void getArea() = 0; // 纯虚函数};class Circle :public Figure {public: Circle(i原创 2021-08-25 20:51:27 · 137 阅读 · 0 评论 -
35 多态原理
当类中声明虚函数时,编译器会在类中生成一个虚函数表虚函数表是一个存储类成员函数指针的数据结构#include<iostream>using namespace std;// 多态成立三条件// 继承 虚函数重写 父类指针指向子类class Parent {public: Parent(int a = 0) { this->a = a; } virtual void print() { // virtual 放入虚函数表 cout << "Pare原创 2021-08-25 20:46:21 · 66 阅读 · 0 评论 -
34 多态
遇到的问题:希望根据指针的指向(指向子类时),可以调用不同类中的函数(子类中的函数)#include<iostream>using namespace std;class Parent {public: Parent(int a) { this->a = a; cout << "Parent构造 a:" << a << endl; } void print() { cout << "Parent a: " <原创 2021-08-25 20:44:15 · 51 阅读 · 0 评论 -
04 数组类型、数组指针类型、数组指针类型变量
数组类型、数组指针类型、数组指针类型变量数组别名#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>#include <string.h>#include <stdlib.h>typedef unsigned int u32;int main(void){ //int a[10]; typedef int (ARRAY_INT_10) [10]; //为 int【10】这种数组 起一个别名 AR原创 2021-08-21 16:22:02 · 87 阅读 · 0 评论 -
33 继承
类与类之间的关系 继承1 继承说明1 子类拥有父类的所有变量和成员函数2 子类可以拥有父类没有的方法和属性#include<iostream>using namespace std;class Parent {public: void print() { cout << "a:" << a << endl; cout << "b:" << b << endl; } int a; int b;原创 2021-08-20 11:40:21 · 64 阅读 · 0 评论 -
32 运算符重载
自定义数据运算方法复数加法#include<iostream>using namespace std;class Complex {public: int a; int b; Complex(int a = 0, int b = 0) { this->a = a; this->b = b; } void printCom() { cout << a << " + " << b << "i" <原创 2021-08-18 21:10:54 · 99 阅读 · 0 评论 -
31 友元
友元函数友元函数改变类的封装性友元函数是全局函数通过友元函数改变类的私有属性#include<iostream>using namespace std;class A {public: // 声明的位置和public private无关 friend void modifyA(A* pA, int _a); //友元函数 A(int a, int b) { this->a = a; this->b = b; } int getA() { ret原创 2021-08-16 20:38:28 · 52 阅读 · 0 评论 -
30 数组类封装
MyArray.h#pragma once#include<iostream>using namespace std;class Array {public: Array(int length); Array(const Array& obj); ~Array(); void setData(int index, int value); int getData(int index); int length();private: int m_length;原创 2021-08-16 20:37:35 · 55 阅读 · 0 评论 -
29 面向对象模型
判断对象所占内存class C1 {private: int i; int j; int k;};class C2 {private: int i; int j; int k; static int m;public: int getK() const { return k; } void setK(int val) { k = val; }};struct S1 {private: int i; int j; int k;};struct S2 {pr原创 2021-08-16 20:36:01 · 153 阅读 · 0 评论 -
28 静态成员变量成员函数
1 静态成员变量静态成员提供了一个同类对象的共享机制,static定义成员变量#include<iostream>using namespace std;class BB {public: void printC() { cout << "c:" << c << endl; } void addC() { c += 1; }private: int a; int b; static int c;};int BB::c原创 2021-08-16 20:33:44 · 59 阅读 · 0 评论 -
27 对象的动态建立和释放
1 malloc free c语言的函数new delete 是C++操作符的语法2 new 基础类型变量 分配数组变量 分配类对象new int(100);new char[10];1 分配基础变量#include<iostream>using namespace std;void main() { int* p1 = (int*)malloc(sizeof(int)); *p1 = 10; int* p2 = new int; // 分配基础类型 *p2 =原创 2021-08-16 20:32:17 · 67 阅读 · 0 评论 -
26 构造函数初始化列表
c++列表提供初始化列表对成员变量进行初始化#include<iostream>using namespace std;class A {public: A(int _a) { a = _a; cout << "构造函数 " << "a:" << a << endl; } ~A() { cout << "析构函数 " << "a:" << a << endl; }priv原创 2021-08-12 17:31:12 · 60 阅读 · 0 评论 -
25 深拷贝浅拷贝
#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;class Name {public: Name(const char* mp) { m_len = strlen(mp); m_p = (char *)malloc(m_len + 1); strcpy(m_p, mp); } //Name obj2 = obj1; // 编写copy构造函数 使用深拷贝 Name(co.原创 2021-08-12 17:30:05 · 67 阅读 · 0 评论 -
24 构造函数调用规则
1 当类中定义了copy构造函数时,C++编译器不会提供默认构造函数#include<iostream>using namespace std;class Test {public: Test(Test& obj) { a = obj.a + 10; b = obj.b + 10; }private: int a, b;};void main() { Test t1; // 不能调用,没有默认的构造函数}2 当类中定义了有参构造函数时,C++编译器原创 2021-08-12 17:27:50 · 48 阅读 · 0 评论 -
23 构造和析构函数
构造函数1 C++的类可以定义与类名相同的特殊函数,这种与类名相同的函数叫做构造函数2 构造函数在定义时可以有参数3 没有返回类型声明析构函数特殊的成员函数清理对象,析构函数语法:~className()析构函数没有参数,没有返回类型声明析构函数在对象销毁时自动被调用#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;class Test {public: // 无参数 构造函数原创 2021-08-12 17:26:26 · 69 阅读 · 0 评论 -
22 面向过程到面向类
1 设计立方体设计一个立方体,求出面积和体积,比较两个立方体是否相等#include<iostream>using namespace std;class Cube {public: void setABC(int a = 0, int b = 0, int c = 0) { m_a = a; m_b = b; m_c = c; } int getV() { m_v = m_a * m_b * m_c; return m_v; } int getS(原创 2021-08-04 19:25:59 · 74 阅读 · 0 评论 -
21 类的声明 和类的实现分开
MyTeacher.h#pragma once // 只包含一次/* 相当于上面的语句#ifndef __MYTEACHER_H_ // ctrl + shift + u 变大写#define __MYTEACHER_H_#endif*/class MyTeacher{private: int age; char name[32];public: void setAge(); int getAge();};MyTeacher.cpp// 类的实现#includ原创 2021-08-04 19:23:50 · 63 阅读 · 0 评论 -
21 类的声明 和类的实现分开
MyTeacher.h#pragma once // 只包含一次/* 相当于上面的语句#ifndef __MYTEACHER_H_ // ctrl + shift + u 变大写#define __MYTEACHER_H_#endif*/class MyTeacher{private: int age; char name[32];public: void setAge(); int getAge();};MyTeacher.cpp// 类的实现#includ原创 2021-08-02 21:49:19 · 70 阅读 · 0 评论 -
20 C++类和封装(与struct区别)
封装:把属性和方法都进行分装#include<iostream>using namespace std;class MyCircle {public: double m_r; // 成员变量 double m_s;public: double getR() { // 成员函数 return m_r; } double setR(double r) { m_r = r; return m_r; } double getS() { m_s = 3.14原创 2021-07-31 10:07:05 · 156 阅读 · 0 评论 -
19函数重载
1 函数重载 用一个函数名定义不同的函数当函数名和不同的参数搭配时函数的含义不同2 函数重载的标准参数个数不同参数类型不同参数顺序不同3 函数返回值不是函数重载的判断标准#include<iostream>using namespace std;void myPrint(int a) { cout << "a=" << a << endl;}void myPrint(int a, int b) { cout << "a原创 2021-07-31 10:06:27 · 141 阅读 · 0 评论 -
17 内联函数
内联函数代替宏代码块1 内联函数必须和函数体实现写在一起2 直接将函数体放入函数调用的地方3 没有压栈出栈等操作4 编译器不一定接受内联函数的请求5 编译器可能自动把函数优化成内联函数6 内联函数中没有for循环#define MYFUNC(a,b) ((a)<(b)?(a):(b))inline int myfunc(int a, int b) { return a < b ? a : b;}int main() { int a = 1; int b = 3;原创 2021-07-31 10:04:58 · 56 阅读 · 0 评论 -
16 常量引用
// 常量引用架构void main() { // 普通引用 int a = 10; int& b = a; cout << b << endl; // 常引用 int x = 20; const int& y = x; // 常引用,让变量只有可读属性,不能通过y修改x // 1 用变量初始化常引用(如上) // 2 用字面量初始化常引用 { const int a = 40; // c++ 将a 放入符号表 // int&原创 2021-07-30 19:29:43 · 49 阅读 · 0 评论 -
15 引用
概念对变量取别名普通引用必须要初始化#include<iostream>using namespace std;int main() { int a = 10; int& b = a; cout << "b: " << b << endl; // 10 cout << "a: " << a << endl; // 10 a = 200; cout << "b: " <<原创 2021-07-30 15:51:29 · 82 阅读 · 0 评论