- 博客(73)
- 收藏
- 关注
原创 MySQL表的增删改查(进阶)
MySQL表的增删改查(进阶)数据库约束NULL约束--创建表时可以指定某列不为空create table student( id int not null, sn int, name varchar(20));UNIQUE:唯一约束--创建表时指定sn列为唯一的、不重复的create table student( id int not null, sn int unique, name varchar(20));DEFAULT:默认值约束--指定插
2020-08-22 22:49:49 319
原创 MySQL表的增删改查(基础)
MySQL表的增删改查(基础)新增(create)--创建一张学生表create table student( id int, sn int, name varchar(20),);单行数据+全列插入--插入两条记录,参数列表数量必须和定义表的列的数量及顺序一致insert [into] student values(100, 1000, "张三");insert [into] student values(101, 1001, "李四");多行数据+指定列插入--插入
2020-08-16 23:53:47 232
原创 MySQL基本操作
MySQL基本操作数据库数据库是存储管理数据的仓库。数据库的存储介质是内存、磁盘。数据库也是以文件的形式存储数据,为什么不直接使用文件存储?a.文件数据的安全性问题。b.文件不利于数据的储存以及管理。c.文件不利于海量数据的查询以及存储。d.文件在程序中的控制不方便。数据库分类SQL(structure query language)—结构化查询语句。数据库大体可以分为关系型数据库和非关系型数据库。关系型数据库(RDBMS)基于SQL实现,是指采用了关系模型(库、表、行、列)来组织数
2020-08-15 13:34:13 204
原创 强制类型转换
强制类型转换1.C语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发送类型转换。C语言中总共有两种形式的类型转换:1.隐式类型转换:编译器在编译阶段自动运行,不能转就编译失败。2.显示类型转换:需要用户自己处理。int main(){ //隐式类型转换(相近类型,意义相似的类型) int i = 10; double d = 6.66; i = d; cout << i <&
2020-07-28 23:59:21 784
原创 特殊类设计
特殊类设计1.设计一个只能在堆上创建对象的类class HeapOnly{public: HeapOnly(const HeapOnly&) = delete; static HeapOnly* CreateObject() { return new HeapOnly; }private: HeapOnly() {}};2.设计一个只能在栈上创建对象的类class StackOnly{public: static StackOnly CreateObject()
2020-07-24 18:16:05 205
原创 智能指针
智能指针1.内存泄露1.1内存泄露的危害内存泄露指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。1.2内存泄露分类堆内存泄露堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块
2020-07-24 11:25:32 164
原创 二叉树的非递归遍历
二叉树的非递归遍历前序遍历class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> ret; stack<TreeNode*> st; TreeNode* cur = root; while(cur || !st.empty()) { while(
2020-07-19 10:09:18 335
原创 异常
异常1.C语言传统的处理错误的方式1.终止程序,如assert。缺陷:用户难以接受。2.返回错误码。缺陷:需要程序员自己去查找对应的错误。3.C标准库中setjmp和longjmp组合。2.C++异常概念异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接调用者处理这个错误。throw:当出现问题时,程序会抛出一个异常。这是通过使用throw关键字来完成的。catch:在你想要处理问题的地方,通过异常处理程序捕获异常。catch关键字用于捕获异常,可
2020-07-17 17:57:55 211
原创 C++11
C++111.初始化列表1.1内置类型的初始化列表int main(){ //内置类型变量 int a1 = { 10 }; int a2(10); int a3 = 1 + 1; int a4 = { 1 + 1 }; int a5{ 1 + 1 }; //数组 int arr1[5]{ 1,2,3,4,5 }; int arr2[]{ 1,2,3,4,5 }; //动态数组 int* arr3 = new int[5]{ 1,2,3,4,5 }; //标准容器 vect
2020-07-16 17:24:08 256
原创 位图
位图1.位图的概念所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景,通常是用来判断某个数据存不存在的。2.位图的实现namespace BitSet{ class bitset { public: bitset(size_t n) { _bit.resize(n / 32 + 1, 0); _num = 0; } void set(size_t x) { size_t index = x / 32; size_t pos =
2020-07-12 22:06:42 4829
原创 哈希
哈希1.unordered系列关联式容器1.1unordered_setint main(){ unordered_set<int> s; //插入操作 s.insert(1); s.insert(4); s.insert(2); s.insert(5); //删除值为1的元素 s.erase(1); //有效元素个数 s.size(); //查找值为4的元素 unordered_set<int>::iterator ret = s.find(4);
2020-07-12 17:59:06 358
原创 高级IO
高级IO四种典型IO模型IO过程:发起IO调用,等待IO条件就绪,进行数据拷贝。阻塞IO发起IO调用,若IO就绪条件不满足,则立即报错返回。优点:流程非常简单,一个IO完成后进行下一个。缺点:无法充分利用资源,效率较为低下。非阻塞IO发起IO调用,若IO就绪条件不满足,则立即报错返回。优点:相较于阻塞IO,对资源的利用较为充分,可以利用就绪等待时间干点其它事情或者发起另一个IO调用。缺点:相较于阻塞IO,流程稍微复杂,IO调用需要循环发起,IO不够实时,必须等待其他事情办完或者其它IO完
2020-07-11 18:34:10 228
原创 map和set
set和map1.关联式容器在之前,我们已经接触过STL容器中的部分容器(vector、list、deque、forward_ list),这些容器我们称为序列式容器。因为其底层是线性的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,里面存储的是<key,value>结构的键值对,在数据索引时比序列式容器效率更高。2.键值对用来表示具有一一对应关系的一种结构,该结构中一般只有两个成员变量key和value。key代表键值,value表示与key对应的
2020-07-06 15:16:54 142
原创 红黑树
红黑树1.红黑树的概念红黑树是一种二叉搜索树,但在每个节点上增加一个存储位表示节点的颜色,可以是RED和BLACK,通过对于任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,是近似平衡的。2.红黑树的性质a.每个结点不是红色就是黑色。b.根节点是黑色的。c.如果一个节点是红色的,则它的两个孩子结点是黑色的。d.对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点3.红黑树结点的定义enum Colour{ RED,
2020-07-05 17:01:46 170
原创 AVL树
AVL树1.AVL树的概念二叉搜索树虽然可以缩短查找的效率,但如果有序或接近有序二叉搜索将退化成单支树,查找元素相当于在顺序表中查找元素,效率低下。AVL树可以很好的解决上一问题,它的本质是一棵平衡二叉树,当向二叉树中插入新结点后,能够保证每个结点的左右子树高度差不超过1。2.AVL树结点的定义template<class K, class V>struct AVLTreeNode{ AVLTreeNode<K, V>* _left;//左孩子 AVLTreeNo
2020-07-02 16:34:59 123
原创 网络基础3
网络基础3网络层负责地址管理与路由选择。IP协议格式4位版本号:IPV4/IPV6。4位首部长度:标识IP报头有多长,以4字节为单位(最小20字节/最大60字节)。8位服务类型:3位弃用/1位置0,4位TOS字段-最大吞吐量/最小成本/最高可靠性/最小延时。16位数据报长度:限制了一个完整的IP报文最大长度不超过64K,意味着udp报文数据长度不能超过64K-20-8。分片标识:数据在实际传输时的最大长度不仅受限于数据报长度字段,并且受限于链路层的一个信息-MTU(最大传输单元:链路层中一
2020-06-28 17:24:16 3549
原创 二叉搜索树
二叉搜索树1.二叉搜索树1.1概念二叉搜索树又称为二叉排序树,它具有以下性质:a.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。b.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。c.它的左右子树也分别为二叉搜索树。1.2二叉搜索树查找若根节点不为空: 如果根节点key==查找key,返回true 如果根节点key>查找key,在其左子树查找 如果根节点key<查找key,在其右子数查找否则返回false1.3二叉搜索树的
2020-06-21 17:01:16 166
原创 C++多态
C++多态1.多态的概念多态的概念:通俗的来说就是多种形态,具体就是去完成某一个行为,当不同的对象去完成时会产生出不同的状态。比如说买高铁票这一行为,当普通人买票时,是全价买票;学生是半价买票;军人是优先半价买票。2.多态的定义及实现2.1多态的构成条件多态是在具有继承关系的不同类对象,去调用同一函数,产生了不同的行为。在继承中要构成多态还有两个条件:1.必须通过基类的指针或者引用调用虚函数。2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。2.2虚函数即被virtual修
2020-06-18 15:28:19 253
原创 网络基础2
网络基础21.应用层应用层:直面程序员的一层,因为应用程序是程序员自己写的,因此应用层的协议都是程序员自己定的。1.1自定制协议自定制协议:程序员自己根据自己的应用特点,定义协议(数据的格式/数据的描述信息)。网络版计算器用一个简单的网络版计算器距离说明自定制协议如何定制。客户端把要计算的两个数字和运算符发过去,然后由服务器进行计算,最后再把结果返回给客户端。方案一:将所有数据转换成字符串,使用特殊字符间隔,这时候就将数据按照指定协议组织起来了。string str = "1 2 +";方
2020-06-14 18:53:21 317
原创 C++继承
C++继承1.继承的概念及定义1.1继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程,以前我们接触的复用都是函数复用,继承是类设计层次的复用。class Person{public: void Print() { cout << _name << endl; cout << _age
2020-06-06 19:45:20 7613 3
原创 C++模板进阶
C++模板进阶1.非类型模板参数模板参数分类型模板与非类型参数。类型形参:出现在模板参数列表中,跟在class或者typename之后的参数类型名称。非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。template <class T, size_t N = 10> //N就是非类型模板参数class array{private: T _array[N];};1.浮点数、类对象以及字符串不允许作为非类型模板参数。2.非类
2020-06-03 15:59:25 280
原创 C++---stack_queue
C++——stack_queue1.stack的介绍和使用1.1stack的介绍a.stack是一种容器适配器,专门用在具有先进后出操作的上下文环境中,其删除只能从容器的一段进行元素的插入与提取操作。b.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部被压入和弹出。c.stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作。empty:判空操作
2020-06-02 15:15:31 227
原创 网络编程套接字
网络编程套接字1.网络字节序我们知道内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件文件中的多字节数据相对于文件中的偏移地址也有大小端之分,网络数据流同样有大小端之分。大小端机的判断int main(){ union { int a; char b; }un; un.a = 1; if (un.b == 1) cout << "小端机" << endl; //大端字节序:低地址存高位。 else cout << "大端机"
2020-05-31 20:30:34 307
原创 C++---list
C++——list1.list的介绍及使用1.1list的介绍a.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。b.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。c.list与forward_list非常相似。主要的不同在于forward_list是单链表,只能朝前迭代,以让其更简单高效。d.与其他的序列式容器相比,list通常在任意位置进行插入、移除元素的执行效率更好。e
2020-05-28 22:57:30 218
原创 C++---vector
C++———vector1.vector的介绍及使用1.1vector的介绍a.vector是表示可变大小数组的序列容器。b.就像数组一样,vector也采用的连续存储空间来存储元素。c.本质讲,vector使用动态分配数组来存储它的元素。1.2vector的使用1.2.1vector的定义int main(){ vector<int> v1; //无参构造 vector<int> v2(5, 1); //构造并初始化5个1 vector<int>
2020-05-25 15:52:49 225
原创 网络基础
网络基础—011.网络发展独立模式:计算机之间互相独立。网络互联:多台计算机连接在一起,完成数据共享。局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起。广域网WAN:将远隔千里的计算机连接在一起。2.网络协议初识“协议“是一种约定。网络通信协议:网络通信中的数据格式约定—遵循同意协议标准,才能实现实质通信,实现网络互联。在整个网络通信环境中有非常多的通信协议,每个协议应对的通信场景有所不同。协议分层:根据通信场景不同,提供的服务不同,使用的协议不同进行的层次划分。典型协议分
2020-05-19 18:25:06 162
原创 线程池
线程池1.线程池线程池:线程的池子,有很多线程,但是数量不会超过池子的限制。需要用到多执行流进行任务处理的时候,就从池子中取出一个线程去处理。应用场景:有大量的数据处理请求,需要多执行流并发/并行处理。实现:一堆线程+线程安全的任务队列,然后不断取出任务进行处理。如果一次数据请求的到来伴随一个线程的创建去处理,则会产生一些风险以及一些不必要的消耗:1.线程若不限制数量的创建,在峰值压力下,线程创建过多,资源耗尽,有程序崩溃的风险。2.每次创建线程和销毁线程都需要时间。线程池使用已经创建好的线程
2020-05-14 21:56:42 153
原创 C++---string
C++——string类1.标准库中的string类1.1string类a.string类是表示字符串的字符串表b.该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作c.string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> stringd.不能操作多字节或者变长字符的序列e.在使用string类时,必须包含string头文件以及using
2020-05-13 17:40:47 218
原创 生产者消费者模型
生产者消费者模型1.概念生产者消费者模型就是通过一个容器来解决生产者和消费者的强耦合问题。应用场景:有线程不断的生成数据,有线程不断的处理数据。优点:解耦合,支持忙闲不均,支持并发。2.基于阻塞队列的生产者消费者模型在多线程编程中阻塞队列是一种常用于实现生产者和消费者模型的数据结构。与普通队列的区别在于,当队列为空时,从队列获取元素的操作会阻塞,直到队列中放入了元素;当队列满时,往队列中存元素的操作也会阻塞,直到有元素被从队列中取出。#include<cstdio>#includ
2020-05-12 19:13:52 222
原创 Linux多线程
Linux多线程1.线程概念线程是进程中的一条执行流。在之前进程的章节,我说进程就是一个pcb,是程序动态运行的描述,通过pcb可以实现操作系统对程序运行的调度管理。在本章节,我们知道线程是进程中的一条执行流,这个执行流在linux中是通过pcb来实现的,因此linux下的线程就是一个pcb,但是这个pcb共用同一个虚拟地址空间,相比较传统pcb更加轻量化,因此也被称为轻量级进程。lin...
2020-05-08 17:12:32 238
原创 C++模板初阶
C++模板初阶1.函数模板我们下面来实现一个交换函数。void Swap(int& a, int& b){ int tmp = a; a = b; b = tmp;} void Swap(double& a, double b){ double tmp = a; a = b; b = tmp;}void Swap(char& a, ch...
2020-04-29 17:48:32 181
原创 C&C++内存管理
C&C++内存管理1.内存分布栈又叫堆栈,非静态局部变量/函数参数/返回值等等。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。堆用于程序运行时动态内存分配。数据段存储全局变量和静态数据。代码段可执行的代码/只读常量。#include<stdio.h>int a = 0; //a在数据段static int b = 0; //b在数据段in...
2020-04-28 21:04:51 347
原创 Linux进程信号
Linux进程信号信号是一个软件中断。操作系统通过信号告诉进程发生了某个事件,打断进程当前的操作,去处理这个事件。1.信号的查看kill -l //查看系统中的信号种类在Linux操作系统中,一共有62中信号。1~31号信号:从unix借鉴而来的,每个信号都有具体对应的系统事件------非可靠信号。34~64号信号:后期扩充的,因为没有具体对应事件,因此命名比较草率------可靠...
2020-04-23 19:03:45 167
原创 C++类与对象—03
C++类与对象—031.初始化列表在创建对象时,编译器通过调用构造函数给对象中各个成员变量一个合适的初始值。但是构造函数中的语句只能将其称为赋初值,而不能称为初始化,因为初始化只能初始化一次,而构造函数体内可以多次赋值。初始化列表:以一个冒号开始,用逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。class Date{public: Date(int yea...
2020-04-22 21:36:39 113
原创 Linux进程间通信
Linux进程间通信每一个进程之间具有独立性,因此无法直接通信所以才需要操作系统提供进程间通信方式,实现进程间的通信。操作系统针对不同的通信场景提供了多种不同的通信方式:数据传输–管道/消息队列;数据共享–共享内存;进程控制–信号量。1.管道本质:内核中的一块缓冲区,多个进程访问同一个管道就可以实现通信。种类:匿名管道/命名管道。匿名管道内核中的缓冲区没有具体的标识符,因此只能用于具...
2020-04-19 20:19:01 142
原创 C++类与对象—02
C++类与对象—02类的6个默认成员函数class Date();对于上面这个类,他什么成员都没有,简称为空类。但是空类中真的什么都没有吗?并不是如此,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。1.构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。特性1...
2020-04-18 18:43:50 158
原创 基础IO—02
Linux基础IO—021.文件描述符与文件流指针的关系文件描述符:是一个非负整数—系统调用的IO接口。文件流指针:FLIE结构体—库函数IO接口的操作句柄。我们知道,库函数是对系统调用接口的一层封装。通过文件流指针进行最终文件操作的时候,依然还要能够找到文件对于的文件描述符才可以。文件流指针是一个结构体,结构体中有很多成员变量,其中就有一个叫_fileno,它就是文件描述符。int m...
2020-04-17 19:32:51 151
原创 八大排序算法的实现--C语言
八大排序算法的实现–C语言1.插入排序void InsertSort(int* arr, int size){ for (int i = 0; i < size - 1; i++) { int end = i; int tmp = arr[end + 1]; while (end >= 0) { if (arr[end] > tmp) { ...
2020-04-16 17:55:19 295
原创 基础IO—01
Linux基础IO—011.标准库的IO接口标准库的IO接口有:fopen/fwrite/fread/fseek/fcloseFILE* fopen(char* filename, char* mode);//(文件名称,打开方式)打开方式:r只读/r+读写/w只写/w+只读/a追加写/a+追加读写/b二进制操作r+和w+的区别:r+读写打开文件,若文件不存在则报错/w+读写打开文件,若...
2020-04-15 21:40:51 154
原创 Linux进程控制—02
进程控制—021.程序替换程序替换本质来说就是替换一个pcb在内存中对应的代码和数据。加载另一个程序到内存中,然后更新页表信息,初始化虚拟地址空间。这个进程pcb将从头重新开始调度新的程序运行。程序替换函数族int execl(const char* path, const char* arg, ...);int execlp(const char* flie, const char* ...
2020-04-14 16:54:15 150
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人