- 博客(297)
- 资源 (18)
- 收藏
- 关注
原创 [C++]22种设计模式的C++实现
C++设计模式前言1. 代码仓库https://github.com/TOMO-CAT/CppDesignPattern2. 前置知识UML类图与面向对象编程软件设计原则与SOLID原则创建型模式工厂方法模式(Factory Method)抽象工厂模式(Abstract Factory)生成器模式(Builder)原型模式(Prototype)单例模式(Singl...
2022-03-18 22:14:26
1737
原创 [Skill]GitBook搭建
GitbookLinux centos7.2安装方式1. 安装node.js从官网拿到文件的下载链接:英文网址:https://nodejs.org/en/download/中文网址:http://nodejs.cn/download/wget https://npm.taobao.org/mirrors/node/v10.16.3/node-v10.16.3-linux-x64....
2021-09-20 21:57:51
1075
原创 [C++面试]多态
概念多态在代码中指的就是“一个接口,多种实现”(相同的调用方法有不同的实现方式),属于面向对象编程的核心概念。广义的多态包括静态多态和动态多态,其中静态多态指的是编译时就可以确认使用的接口,动态多态指的是运行时才能确定具体引用的接口。静态多态和动态多态本质上的区别在于什么时候(编译期间or运行期间)将函数实现与函数调用关联起来。静态多态在编译期间就可以确定函数的调用地址并产生对应代码,动态多...
2021-09-19 18:04:13
533
原创 [C++面试]拷贝初始化与直接初始化
总结初始化值的是创建变量时赋予变量一个值(不同于赋值的概念)使用等号=初始化对象时是拷贝初始化,否则是直接初始化直接初始化也可能调用拷贝构造函数,拷贝初始化可以不调用拷贝构造函数初始化概念对象是类的实例化,在内存中会占据一个一定大小的空间。创建一个对象分为两步:分配内存空间和初始化,刚刚分配的空间有可能包含脏数据,因此我们需要通过初始化函数(C++中指的是构造函数)对分配的空间进行正...
2021-09-19 18:02:51
777
原创 [C++面试]宏相关问题
1. 宏常量与宏函数C++中用#define <宏名> <字符串>命令定义宏,在代码中将字符串替换宏名出现的位置。定义宏的方式根据是否包含参数可以分为两种:#define <宏名> <字符串>#define PI 3.1415926#define <宏名>(<参数列表>) <宏体>#define A(x...
2021-09-19 18:02:07
264
原创 [C++面试]C与C++(面向过程与面向对象)区别
综述C是一门结构化语言,重点在于数据结构与算法,侧重于对于输入进行运算得到输出(面向过程)。而C++考虑的是构造一个对象模型,通过获取对象的方法和属性来得到输出(面向对象)。面向对象与面向程序1. 区别面向对象:将问题拆解成多个步骤,通过一个一个步骤调用解决问题面向对象:将问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个问题中的行为2. 例子以五...
2021-09-19 18:01:22
452
原创 C++函数参数传递
引用传递和值传递1. 值传递当形参是非引用类型时,实参的值会被拷贝给形参,实参和形参是两个完全不同的对象,函数对形参做的所有操作都不会影响实参。Tips:当形参是指针类型时,形参和实参也是两个完全不同的指针,只不过他们指向同个对象。因为指针使我们可以间接地访问它所指向的对象,因此通过指针可以修改它所指对象的值。熟悉C语言的程序员常常使用指针类型的形参访问函数外部的对象,在C++语言中,...
2021-05-09 02:17:31
741
原创 C++标准库类型迭代器
简介所有标准库类型都可以使用迭代器,但是其中只有少数几种才同时支持下标运算符,有迭代器的类型都拥有begin()和end()的成员函数:/* * b和e类型相同 * 1) b: 表示v的第一个元素 * 2) e: 尾后迭代器, 表示尾元素的下一个位置 */auto b = v.begin(), e = v.end();Tips:如果容器为空,那么begin()和end()返回的都...
2021-04-25 22:21:47
311
原创 C++标准库类型vector
头文件#include <vector>using std::vector;定义和初始化vector常用的初始化方法为:// 默认初始化: v不含任何元素, 但是只能添加类型T的元素vector<T> v1;// 拷贝初始化: v2中包含v1所有元素的副本vector<T> v2 = v1;vector<T> v2(v1);/...
2021-04-25 22:20:50
400
原创 C++标准库类型string
头文件#include <string>using std::string;定义与初始化初始化string对象的方法比较多,下面列出最常用的几种:#include <string>#include <iostream>int main(void) { using std::string; string s1; ...
2021-04-25 22:20:09
308
原创 C++中变量声明与定义的规则
声明与定义分离Tips:变量能且仅能被定义一次,但是可以被多次声明。为了支持分离式编译,C++将定义和声明区分开。其中声明规定了变量的类型和名字,定义除此功能外还会申请存储空间并可能为变量赋一个初始值。extern如果想声明一个变量而非定义它,就使用关键字extern并且不要显式地初始化变量:extern int i; // 声明i而非定义iextern int i = ...
2021-04-18 21:27:41
7111
原创 C++中五花八门的初始化规则
总结初始化的概念:创建变量时赋予它一个值(不同于赋值的概念)类的构造函数控制其对象的初始化过程,无论何时只要类的对象被创建就会执行构造函数如果对象未被用户指定初始值,那么这些变量会被执行默认初始化,默认值取决于变量类型和定义变量的位置无论何时只要类的对象被创建就会执行构造函数,通过显式调用构造函数进行初始化被称为显式初始化,否则叫做隐式初始化使用等号(=)初始化一个类变量执行的是拷贝初...
2021-04-18 12:47:12
792
1
原创 C++中的POD类型
C++ POD类型背景POD(Plain Old Data)指的是C++定义的和C相兼容的数据结构。几乎所有的系统底层都是用C写的,当时定义的基本数据类型比如int、char、float、枚举、指针、数组和结构等通过二进制拷贝后还能保持数据不变,即编译器可以通过二进制数据将该类型正确解析出来。C++中的类类型引入了继承和派生等新概念,编译器无法解析这些复杂数据结构,因此C++提出POD数...
2021-04-15 01:12:06
471
原创 C++11显式虚函数重载:override与final
场景在传统C++中,经常容易发现意外重载虚函数的事情:struct Base { virtual void foo();};struct SubClass: Base { void foo();};有下列三种场景:SubClass::foo可能是程序员加入的一个和基类虚函数恰好同名的成员函数,却被编译器当作重载虚函数SubClass::foo可能是程序员想重...
2021-04-13 00:39:58
1058
1
原创 解决python3中关于import的疑难杂症
python中import与包管理概念:模块与包模块module:一般是以.py为后缀的文件,也包括.pyo、.pyc、.pyd、.so和.dll后缀的文件,模块内定义了函数、类以及变量包package:包是含有若干个模块的文件夹,在工程项目用包管理模块可以避免模块名冲突__init__.py在Python工程项目中,如果一个文件夹下有__init__.py文件就会认为该文件夹是一个...
2021-04-05 11:00:51
693
原创 《C++Primer》算法概览
C++ 算法概览beg和end表示元素范围的迭代器beg2表示第二个序列开始位置迭代器,end2表示第二个序列末尾迭代器(如果有的话)。如没有end2则假定系列2至少与beg和end表示的范围一样大。beg和beg2类型不必匹配,但必须保证两个序列中的元素可以执行特性操作或调用给定的可调用对象。des表示目的序列的迭代器。对于给定输入序列,算法需要生成多少元素,目的序列保证有足够的空间存放...
2020-12-02 01:03:28
405
1
原创 《C++Primer》第十九章
第十九章 特殊工具与技术控制内存分配1. 重载new和delete重载这两个运算符与重载其他运算符的过程大不相同。想要真正重载new和delete的方法,首先要对new表达式和delete表达式的工作机制足够了解:// new表达式string *sp = new string("a value"); // 分配并初始化一个string对象string *arr = new stri...
2020-12-02 01:01:36
436
1
原创 《C++Primer》第十八章 用于大型程序的工具
第十八章 用于大型程序的工具异常处理1. 抛出异常在C++语言中,我们通过抛出throwing一条表达式来引发raised一个异常。当执行一个throw时,跟在throw后面的语句将不再被执行。相反,程序的控制权从throw转移到与之匹配的catch模块。throw类似于return,其后面的代码不会再被执行。1.1 栈展开如果对抛出异常的函数的调用语句位于一个try语句内,则检查...
2020-12-02 01:00:53
395
1
原创 《C++Primer》第十七章 标准库特殊设施
第十七章 标准库特殊设施tuple类型tuple是类似pair的模板,每个pair的成员类型都不相同,但是每个pair恰好有两个成员。我们希望将一些数据组合成单一对象,但又不想麻烦地定义一个新数据结构来表示这些数据,这时候就可以用到tuple。我们可以将tuple当做一个”快速而随意”的数据结构。它支持的操作包括:tuple<T1, T2, ..., Tn> t;:成...
2020-12-02 00:53:24
329
原创 《C++Primer》第十六章 模板与泛型编程
第十六章 模板与泛型编程定义模板1. 函数模板模板定义以关键字template关键字开始,后面跟着一个模板参数列表(不能为空):template <typename T>int compare(const T &v1, const T &v2){ if (v1 < v2) return -1; if (v2 < v1) retur...
2020-11-21 14:11:30
630
原创 《C++Primer》第十五章 面向对象程序设计
第十五章 面向对象程序设计概述面向对象程序设计object-oriented programming的核心思想是数据抽象、继承和动态绑定:使用数据抽象,我们可以将类的接口与实现分离使用继承可以定义相似的类型并对其相似关系建模使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象1. 继承在层次关系根据的类被称为基类bsae class,其他类则直接或间接地...
2020-11-21 14:07:31
847
1
原创 《C++Primer》第十四章 重载运算与类型转换
第十四章 重载运算与类型转换基本概念当一个重载符是成员函数时,this绑定到左侧运算对象,成员运算符的(显式)参数数量比运算对象的数量少一个运算符函数必须要么是类的成员,要么最少含有一个类类型的参数,不能为int重定义内置的运算符我们只能重载已有的运算符,而不能发明新的运算符我们可以冲在大部分的运算符,但是::、.*、.和?:这四个运算符是不能被重载的使用重载的运算符本质上是一次函数...
2020-11-21 14:06:44
509
原创 《C++Primer》第十三章 拷贝控制
第十三章 拷贝控制简介当定义一个类时,我们显式或者隐式地指定此类型对象拷贝、移动、赋值和销毁时做什么。一个类通过定义五种特殊的成员函数来控制这些操作:拷贝构造函数copy constructor拷贝赋值运算符copy-assignment operator移动构造函数move constructor移动赋值运算符move-assignment operator析构函数des...
2020-11-21 14:04:05
502
原创 《C++Primer》第十二章 动态内存
静态内存、栈内存和堆我们前面只提到了静态内存或栈内存:静态内存:用来保存局部static、类static数据成员和定义在任何函数之外的变量栈内存:保存定义在函数内的非static对象分配在静态内存或者栈内存的对象由编译器自动创建和销毁。对于栈对象仅在其定义的程序块运行时才存在,static对象在使用之前分配,在程序结束时销毁。每个程序还拥有一个内存池(被称为自由空间free stor...
2020-11-19 23:35:03
460
原创 《C++Primer》第十一章 关联容器
简介标准库提供8个关联容器:map:关联数组set:只保存关键字multimap:关键字可重复出现的mapmultiset:关键字可重复出现的setunordered_map:用哈希函数组织的mapunordered_set:用哈希函数组织的setunordered_multimap:哈希组织的multimapunordered_multiset:哈希...
2020-11-19 23:33:14
337
原创 《C++Primer》第十章 泛型算法
概述标准库没有为每个顺序容器都定义成员函数来实现诸如查找特定元素、替换或删除一个特定值、重排元素顺序等操作,而是定义了一组泛型算法generic algrithm:算法:实现了一些经典算法的公共接口,如排序和搜索泛型:可以用于不同类型的元素和多种容器类型,不仅包括vector和list等标准库类型,还包括内置的数组类型泛型算法永远都不会执行容器的操作,它们只会运行于迭代器只上,执行迭...
2020-11-19 23:28:16
498
原创 《C++Primer》第九章 顺序容器
简介容器指的是一些特定类型对象的集合,顺序容器sequential container为程序员提供了控制元素在存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。后面第十一章会介绍有序和无序关联容器,会根据关键字的值来存储元素。顺序容器类型vector:可变大小数组,支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢deque:双端队列,支...
2020-11-19 23:25:26
428
原创 《C++Primer》第八章 IO库
IO类前面提到的IO类型和对象都是操纵char数据的,并且都是关联到用户的控制台窗口的。我们还有其他IO需求:除了从控制台进行IO操作,应用程序还经常需要读写文件除了操纵char数据还需要操纵string为了支持上述操作,在istream和ostream,标准库还定义了一些其他IO类型。分别定义在三个独立的头文件中:iostream:定义了用于读写流的基本类型fstream...
2020-11-19 23:24:04
333
原创 《C++Primer》第七章 类
简介类的基本思想是数据抽象data abstraction和封装encapsulation。数据抽象是一种依赖于接口interface和实现implementation分离的编程技术。类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。定义抽象数据类型定义一个Sales_data类,数据成员包括:bookNo:string类型,...
2020-11-17 23:03:21
461
原创 《C++Primer》第六章 函数
函数基础函数调用完成两项工作:一是实参初始化函数对应的形参,二是将控制权转移给被调用函数。此时主调函数的执行被暂时中断,被调函数开始执行实参是形参的初始值,我们可以用double型的实参初始化int型的形参,但存在精度丢失的问题函数的形参列表可以为空,但是不可以省略,可以写成()或(void)函数的返回类型不可以是数组类型或者是函数类型,但可以是指向数组或者函数的指针1. 局部对象...
2020-11-17 23:02:26
470
原创 《C++Primer》第五章 语句
写这篇文章的目的身为C++的零基础初学者,短期内把《C++Primer》啃下来是一个比较笨但是有效的方法,一方面可以掌握比较规范的C++语法(避免被项目中乱七八糟的风格带跑偏),另一方面又可以全面地了解C++语法以及C++11新标准(后续要做的事情就剩下查漏补缺,不断完善自己的知识体系)。个人感觉从零学习一门新知识比较好的方法是快速了解知识的全貌,然后构建自己的知识地图,后续不断地补充相应的...
2020-11-17 01:19:26
400
原创 《C++Primer》第四章 表达式
写这篇文章的目的身为C++的零基础初学者,短期内把《C++Primer》啃下来是一个比较笨但是有效的方法,一方面可以掌握比较规范的C++语法(避免被项目中乱七八糟的风格带跑偏),另一方面又可以全面地了解C++语法以及C++11新标准(后续要做的事情就剩下查漏补缺,不断完善自己的知识体系)。个人感觉从零学习一门新知识比较好的方法是快速了解知识的全貌,然后构建自己的知识地图,后续不断地补充相应的...
2020-11-17 01:18:16
367
原创 《C++Primer》第三章 字符串、向量和数组
写这篇文章的目的身为C++的零基础初学者,短期内把《C++Primer》啃下来是一个比较笨但是有效的方法,一方面可以掌握比较规范的C++语法(避免被项目中乱七八糟的风格带跑偏),另一方面又可以全面地了解C++语法以及C++11新标准(后续要做的事情就剩下查漏补缺,不断完善自己的知识体系)。个人感觉从零学习一门新知识比较好的方法是快速了解知识的全貌,然后构建自己的知识地图,后续不断地补充相应的...
2020-10-20 23:37:02
713
原创 《C++Primer》第二章 变量和基本类型
写这篇文章的目的身为C++的零基础初学者,短期内把《C++Primer》啃下来是一个比较笨但是有效的方法,一方面可以掌握比较规范的C++语法(避免被项目中乱七八糟的风格带跑偏),另一方面又可以全面地了解C++语法以及C++11新标准(后续要做的事情就剩下查漏补缺,不断完善自己的知识体系)。个人感觉从零学习一门新知识比较好的方法是快速了解知识的全貌,然后构建自己的知识地图,后续不断地补充相应的...
2020-10-19 21:22:34
644
原创 [Skill]从零掌握正则表达式
前言无论你是出于什么原因需要掌握正则表达式(诸如爬虫、文本检索、后端服务开发或Linux脚本),如果之前从没接触过正则表达式(比如我)很容易在如山般的公式中迷失,以至于你在项目写的正则表达式很可能会因为组织混乱而被后来的开发者吐槽。正则表达式Regular Expression本质上是一种文本模式,包括普通字符和特殊字符(也被称为元字符),使用一个字符串表达式来匹配符合该规则的字符串。学习工...
2020-06-13 01:15:55
1005
原创 [shell脚本]可视化输出表格数据
image.png最终效果1. 自定义表格样式image.png2. 自定义主题颜色支持三系普通颜色支持16色彩虹色支持单颜色回顾一下shell语法1. shell传递参数我们可以在执行shell脚本时实时传递参数从而指定某些具体的参数(在本例中包括表格的样式、颜色等),脚本中获取参数的格式为$n。其中除n为0表示执行的文件名外,1表示第一个参数,2...
2020-05-31 01:04:15
6784
3
原创 [shell脚本]表格数据在终端上可视化输出
最终效果1. 自定义表格样式[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4qfeL05x-1590857934848)(https://pic.downk.cc/item/5ed23405c2a9a83be5871691.jpg)]2. 自定义主题颜色支持三系普通颜色支持16色彩虹色支持单颜色回顾一下shell语法1. shell传递参数我们可以在执行shell脚本时实时传递参数从而指定某些具体的参数(在本例中包括表格的样式、颜色等),脚本中获取参数.
2020-05-31 01:00:36
2671
1
原创 [Golang]golang使用mysql实例和第三方库Gendry
导入对应的包// 安装$ go get github.com/go-sql-driver/mysql// 导入import ( "database/sql" _ "thirdpkg/go-sql-driver/mysql")初始化mysql客户端// 打开数据库,格式是⽤户名:密码@协议/数据库名称?编码⽅式db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8"if er
2020-05-13 00:13:45
1494
原创 [Go实战]golang使用mysql实例和第三方库Gendry
导入对应的包// 安装$ go get github.com/go-sql-driver/mysql// 导入import ( "database/sql" _ "thirdpkg/go-sql-driver/mysql")初始化mysql客户端// 打开数据库,格式是⽤户名:密码@协议/数据库名称?编码⽅式db, err := sql.Open("mysql"...
2020-05-13 00:01:39
1537
原创 [python]可视化利器:pyecharts
前言前面我们提及ggplot在R和Python中都是数据可视化的利器,在机器学习和数据分析领域得到了广泛的应用。pyecharts结合了Python和百度开源的Echarts工具,基于其交互性和便利性得到了众多开发者的认可。拥有如下的特点:可集成至Flask、Django等主流web框架相较于matplotlib等传统绘图库,pyecharts语法更加简洁,更加注重数据的呈现方式而非图形细节包含原生的百度地图,方便绘制地理可视化图形本文主要整理自pyecharts官网github文档:htt
2020-05-11 01:28:50
1600
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人