![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C\C++
文章平均质量分 58
qx LIU 2000
这个作者很懒,什么都没留下…
展开
-
C++ 基础 --多态
C++--多态多态多态的概念多态的定义虚函数虚函数的重写虚函数重写的两个例外C++11 override 和 final重载、重写(覆盖)、隐藏(重定义)对比多态多态的概念当完成某个行为时,不同的对象去完成,会有不同的状态举个小栗子:买票这个行为,学生买会有打折,普通人买全价票,军人可以优先购票 —多态性为多态分为静态多态和动态多态,其中静态多态就是我们所熟知的函数重载。这里静态的含义是指:在编译期间完成的事件而我们今天主要了解的是动态多态,也就是在进程运行期间的多态。多态的定义多态是不同原创 2021-10-13 17:35:51 · 256 阅读 · 0 评论 -
C++ 基础 --继承
C++继承继承的概念及定义继承关系和访问限定符基类和派生类对象的赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态变量复杂的菱形继承以及虚拟继承虚继承与菱形继承继承的总结继承和组合继承的概念及定义继承是面向对象程序设计的重要特性,其本质就是类的复用。这里属于 is - a 的关系,我们的student 和 teacher 都继承了父类(基类) person 。继承后父类的person的成员 都会变为子类的一部分,实现类的复用。继承关系和访问限定符总结来说,继承后的访问限定是原创 2021-10-11 15:06:48 · 259 阅读 · 0 评论 -
C++--模板进阶
模板进阶一、非类型模板参数二、模板的特化三、模板不支持分离编译一、非类型模板参数我们先来举一个例子:当我们用宏去控制同种类型数组的大小时,无法做到完全的统一,总会有浪费或是不够。此时我们的非类型模板参数就发挥作用了Tips:1.通常给非类型模板参数赋缺省值,这样开辟一个数组就无比的方便了2.这里的非类型模板参数赋值时,仅可为整数二、模板的特化首先回顾一下模板的概念:模板就是编译器自动给我实例化出一份符合逻辑的代码。但是总有些情况,编译器无法给出正确的逻辑。比如此时:当我们比较原创 2021-09-16 17:26:49 · 376 阅读 · 0 评论 -
C++--双端队列deque
双端队列这个结构 ,总是作为stack和queue容器适配器的默认模板参数类型,它的功能很丰富,头删头插,尾插尾删,随机存取等等,看起来就是vector和list的合体。为什么这么说呢?优点缺点vector1.随机访问 2.尾插头、中部插入删除list任意位置插入删除随机访问那么在功能上,我们可以清楚的看到 deque = vector+list真的是这样么?结论:1.deque不能替代vector和list2.deque采用operator [ ]原创 2021-09-16 16:35:18 · 503 阅读 · 0 评论 -
C++ --优先级队列模拟实现
优先级队列:priority_queue template <class T,class Container=vector<T>,class Compare = less<T>> class priority_queue { public: private: Container _con; Compare com; };}我们先来介绍一下priority_queue的类模板的第三个模板参数class Compare = less<T原创 2021-09-16 15:52:03 · 197 阅读 · 0 评论 -
C++初阶--list的模拟实现
今天来模拟实现list我们先来看看官方文档中对于list的描述我们先大致了解一下list的遍历迭代器对于迭代器我们可以用while循环+begin()end()。同时还可以用迭代器区间。当然迭代器区间的方式只适用于内存连续的结构比如数组stringvector等它们的原生指针就可以当作迭代器来用。范围for其实范围for和迭代器的底层是完全一样的,我们只有写好迭代器,才能用范围for,而且这里的迭代器必须和库里的命名一样才可以用范围for我们再来了解一下有关算法函数中,我原创 2021-08-03 02:34:12 · 564 阅读 · 1 评论 -
C++初阶--vector模拟实现
今天我们不直接上代码了,我们先来分析一下vector这个容器。我们来看看这个东西vector<vector>这我们可以大概猜到是一个二维数组。但并不完全是,二维数组是一个n*n 的矩形结构,而这里的vector套vector可不是这样,我们来剖析一下它当我们执行vv [ i] [ j ] 这行代码时首先执行 vv. operator [ i ],也就是vv [ i ] 这时候我们在一个大vector中找到了,很多很多的vector。每一个vector 是用i 控制的,一原创 2021-07-29 20:27:11 · 313 阅读 · 0 评论 -
C++初阶--vector前传--剖析迭代器失效
vector中的迭代器失效问题今天我们来看看迭代器失效的主要原因与解决方法首先我们要了解到,迭代器对于vector阶段来说,我们完全可以把它看成一个指针来理解。我们先来简单实现一下:首先有一个重定义:typedef T* iterator ;就是定义一个指针类型iterator begin(){ return _start;}这不就是一个简单的迭代器吗?当然这是一个普通容器,当然还有const版本,我们这里不深入说了。我们在正式开始主题前,先看一个小问题:原创 2021-07-29 20:12:03 · 261 阅读 · 1 评论 -
C++初阶--string的深入理解及补充
模拟实现完成了string,今天我们来深度理解一下string目录:第一块:有关const修饰函数的问题第二块:有关string实现方案的问题第一块:有关const修饰函数的问题首先我们先对string下一个定义:string 是一个管理字符数组的类,并且这个字符数组的结尾要用‘\0’进行标识。我们主要了解了以下的几个有关string的内容拷贝构造和赋值运算符重载的深拷贝增删查改等相关接口重载了一些常见的运算符迭代器之前有一个不太容易理解的点:第一组:size_t size()原创 2021-07-26 20:54:32 · 193 阅读 · 0 评论 -
C++初阶--string模拟实现
string实现第一部分:默认成员函数的基本接口以及深浅拷贝相关问题。第二部分:string增删查改等功能模拟实现第一部分:默认成员函数的基本接口以及深浅拷贝相关问题。#pragma once#include <iostream>using namespace std;namespace lqx{ class string { public: 构造函数 string(const char* str = "") :_str(new char[strlen(str原创 2021-07-23 20:45:18 · 227 阅读 · 0 评论 -
二刷C++--深入理解基础特性篇
深入理解C++基本特性一、函数重载1.1 函数名修饰规则补充:编译链接过程二、引用一、函数重载函数重载是什么呢?概念:函数名相同,参数不同(类型、个数、顺序)为什么C++支持函数重载,而C语言显然不支持呢?那就得提到另一个概念:函数名修饰规则1.1 函数名修饰规则补充:编译链接过程一个程序运行起来,首先要有几个基本的过程:预处理、编译、汇编、链接。我们今天来简单回顾一下这几个过程发生的事情。上一个小小的图:预处理:将所有的#define 删除,并展开所有的宏定义。处理所有的条件原创 2021-07-19 22:22:26 · 119 阅读 · 0 评论 -
C++初阶--模板
c++模板1. 泛型编程2. 函数模板2.1 函数模板的概念2.2 函数模板的原理2.3 函数模板的实例化2.5 模板参数的匹配原则3. 类模板3.1 类模板的定义格式3.2 类模板的实例化1. 泛型编程用C语言实现交换函数是不是只能这样呢?使用函数重载虽然可以实现,但是有以下几个不好的地方:重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型的出现时,就需要增加函数代码的可维护性比较低,一个出错可能所有的重载均出错。2. 函数模板2.1 函数模板的概念函数模板代表了一个函数原创 2021-06-20 22:12:46 · 182 阅读 · 3 评论 -
C++初阶--内存管理
C++——内存管理1. c/c++内存分布2. C语言中动态内存管理方式2.1 malloc /calloc/realloc和free3 . c++内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作符自定义类型1. c/c++内存分布栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈向下生长。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。堆用于程序运行时的动态内存分配,堆向上增长。数据段–存原创 2021-06-17 15:30:47 · 446 阅读 · 1 评论 -
C++初阶--类和对象(下)
类和对象(下)1.再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字2 . static 成员2.1 概念2.2 特性3. c++11的成员初始化新玩法4. 友元4.1 友元函数4.2 友元类5 . 内部类5.1 概念及特性1.再谈构造函数1.1 构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而原创 2021-06-15 20:57:39 · 329 阅读 · 4 评论 -
C++初阶--类和对象(中)
类和对象(中)1.类的6个默认成员函数2.构造函数2.1 概念2.2 特性3.析构函数3.1 概念3.2 特性4. 拷贝构造函数4.1 概念4.2 特征5. 赋值运算符重载5.1 运算符重载5.2 赋值运算符重载三级目录1.类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。class Date{};2.构造函数2.1 概念构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编原创 2021-06-04 00:37:23 · 204 阅读 · 0 评论 -
C++ 日期类的实现
Date.h#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include <iostream>#include <assert.h>using std::cout;using std::cin;using std::endl;//class Date//{//public:// //1.无参构造函数// Date()// {}//// //2.带参构造函数// Date(int year, int mo原创 2021-06-03 23:02:13 · 234 阅读 · 0 评论 -
C++初阶--类和对象(上)
类和对象(上)1.面向过程和面向对象初步认识2.类的引入3. 类的定义4. 类的访问限定符及封装4 .1访问限定符4.2 封装5.类的作用域6.类的实例化1.面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事拆分为不同的对象,靠对象之间的交互完成。举例:外卖系统面向过程:下单、接单、送餐等过程面向对象:客户、商家、骑手等对象。2.类的引入c语言中,结构体中只能定义变量,在c++中,结构原创 2021-05-24 18:25:16 · 217 阅读 · 5 评论 -
C++初阶 --入门基础中的基础语法
C++入门1. C++关键字2. 命名空间2.1 命名空间的定义命名空间的使用3.C++输入&输出4.缺省参数(备胎)4.1缺省参数概念4.2缺省参数分类函数重载函数重载的概念5.2 名字修饰5.3 extern"C"一级目录两个二级目录三级目录1. C++关键字C++共计63个关键字,C语言32个关键字2. 命名空间在C\C++ 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地原创 2021-05-24 17:44:01 · 331 阅读 · 2 评论 -
C++ 初阶 -- 前言
C++前言1. 什么是C++2. C++发展史3. C++重要性1. 什么是C++c语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,c语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言原创 2021-05-19 10:20:56 · 186 阅读 · 1 评论 -
数据结构-排序-冒泡排序
冒泡排序复杂度最坏:O(N^2)最好:O(N)void BubbleSort(int * a, int n){ ////one //for (int i = 0; i < n; i++) //{ // for (int j = 1; j < n - i; j++) // { // if (a[j - 1]>a[j]) // Swap(&a[j - 1], &a[j]); // } //} //two for (int end = n;原创 2021-05-11 15:04:40 · 82 阅读 · 0 评论 -
数据结构-排序-堆排序
堆排序void AdjustDwon(int * a, int n, int root){ int child = root * 2 + 1; while (child < n) { if (child + 1 < n && a[child + 1] > a[child]) { ++child; } if (a[child] > a[root]) { Swap(&a[child], &a[root]);原创 2021-05-10 16:10:24 · 84 阅读 · 0 评论 -
数据结构-排序-选择排序
选择排序void Swap(int* p1,int * p2){ int tmp = *p1; *p1 = *p2; *p2 = tmp;}void SelectSort(int * a, int n){ int left = 0, right = n - 1; while (left < right) { int minIndex = left, maxIndex = right; for (int i = left; i < right; i++) {原创 2021-05-10 15:59:30 · 74 阅读 · 0 评论 -
数据结构-排序-希尔排序
希尔排序1、预排序 ----> 接近有序2、直接插入排序从而在时间复杂度上有很大的提升gap越大,大小数可以更快挪到对应的位置,越不接近有序gap越小,大的和小的数可以更慢的挪到对应的位置,越接近有序gap == 1 为直接插入排序void ShellSort(int* a, int n){ int gap = n; while (gap > 1) { gap = (gap / 3 + 1); for (int i = 0; i < n - ga原创 2021-05-10 15:35:36 · 123 阅读 · 0 评论 -
数据结构-排序-插入排序
插入排序一、思想:直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经拍好的有序序列中,直到所有记录插入完为止,得到一个新的有序序列-------------扑克牌。解释:当插入第 i (i>=1)个元素时,面前的array[0],array[1],…array[i-1] 已经排好序,此时用array[i]的排序码与前面的排序码进行顺序比较,找到插入位置将array[i]插入,原来位置上的元素后移复杂问题拆解:1、先写单趟排序2、再写多趟排原创 2021-05-10 15:14:13 · 130 阅读 · 0 评论 -
【数据结构】-初阶-堆
Heap.htypedef int HPDataType;typedef struct Heap{ HPDataType* _a; int _size; int _capacity;}Heap;void HeapCreate(Heap* hp, HPDataType* a, int n);void HeapDestory(Heap* hp);void HeapPush(Heap* hp, HPDataType x);void HeapPop(Heap* hp);void Ad原创 2021-04-26 18:18:15 · 124 阅读 · 0 评论 -
[数据结构] -堆与二叉树 【学习笔记】
二叉树1、满二叉树:k层满二叉树节点总数位(2^k)-12、完全二叉树:可以不满,但必须按顺序告诉你一棵二叉树有N个节点,那么他的高度是多少?2^k - 1 =Nk = log(N+1)若根节点为第一层,那么非空二叉树的第i层上最多有2^(i-1)个节点若根节点为第一层,那么深度为h的二叉树的最大结点数是 2^h -1度为零的节点个数比度为二的节点个数多一个:n0 = n2 +1;来两道题练练手,看看概念理解的怎么样?1、某二叉树共有 399 个结点,其中 有199个为 度为2的原创 2021-04-26 16:39:03 · 897 阅读 · 0 评论 -
通讯录(动态存储)
test.c#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"enum Option{ EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT, EMPTY, DESTORY};void menu(){ printf("**********************************\n"); printf("***** 1.add 2.del ******原创 2021-03-10 13:06:18 · 93 阅读 · 0 评论 -
通讯录 --c语言(静态)
直接上代码不多bbtest.c#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"enum Option{ EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT};void menu(){ printf("**********************************\n"); printf("***** 1.add 2.del *******\n");.原创 2021-03-10 12:15:16 · 229 阅读 · 0 评论 -
自定义类型:结构体,枚举,联合
C语言进阶之自定义类型结构体,枚举,联合文章目录C语言进阶之自定义类型结构体,枚举,联合结构体枚举联合(共用体)结构体结构的声明struct tag{ member-list;}variable-list;特殊的声明struct{ int a; char b; float c;}x;此处省略掉了标签 tag结构体的自引用//方法一struct Node{ int data; struct Node* next;};//方法二typedef str原创 2021-03-07 16:43:56 · 120 阅读 · 0 评论 -
数据在内存中的存储
深度剖析数据在内存中的存储一、整形在内存中的存储原码(输入或输出时的数的二进制表示)反码补码 (内存中的存储方式)1.有符号数存储结构均有符号位(首位)+数值位(非首位)(正数符号位为‘0’,负数符号位为‘1’).2.正数:三码相同.3.负数:原码符号位不变,其余按位取反 -->反码,反码+1–>补码.大端和小端大端-- 数据的低字节位存储在内存的高地址处小端-- 数据的低字节位存储在内存的低地址处每种编译器可能存储方式不同,其中vs2013采用的是小端存储的原创 2021-02-01 00:12:49 · 157 阅读 · 0 评论 -
扫雷
扫雷扫雷的基本实现-----C语言game.h#include <stdio.h>#include <stdlib.h>#include <time.h>`#define EAZY_COUNT 10#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2//初始化棋盘void Initboard(char[ROWS][COLS], int rows, int cols,原创 2021-01-25 17:30:23 · 90 阅读 · 0 评论 -
三子棋
三子棋的实现C语言—三子棋test.c//test.c#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu(){ printf("***********************************************\n"); printf("**************** 1.PLAY *****************\n"); printf("**************** 2.E原创 2021-01-24 19:02:26 · 78 阅读 · 0 评论 -
汉诺塔
汉诺塔问题递归的C语言实现//hanoi ----void move(char x, char y){ printf("%c-->%c", x, y);}void hanoi(int n, char a, char b, char c){ if (n == 1) move(a, c); else { hanoi(n - 1, a, c, b); printf("\n"); move(a, c); printf("\n"); hanoi(n - 1, b,原创 2021-01-24 00:47:34 · 84 阅读 · 0 评论 -
c语言中的二分查找
二分查找注意:只能用于 有序 数列查找举一个简单的例子:查找1-10中的数字7元素#include <stdio.h>int main(){ int k = 7; int arr[]={1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; int sz = sizeof(arr) / sizeof(arr[0]);//求数组的长度。 int left = 0;//左下标 int right = sz - 1;//右下标:数组长度减一 wh原创 2021-01-17 00:55:51 · 156 阅读 · 0 评论