自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(200)
  • 资源 (2)
  • 收藏
  • 关注

原创 Go语言 Channel管道的源码分析及图解

文章目录Channel概述Channel结构体信息Channel创建chansend发送1. 直接发送流程图2. 写入缓冲区流程图3. 发送阻塞挂起chanrecv接收1. 直接接收流程图(无缓冲区)2. 直接接收流程图(带缓冲区)3. 从缓冲区接收4. 接收阻塞挂起Channel概述Channel通过通信的方式在goroutine之间共享内存,是支撑Go语言高性能并发编程模型的重要结构,本文将分析Channel相关的创建、发送、接收、关闭函数的源代码。ps:源代码只给出了重要逻辑核心部分Chann

2022-04-05 17:46:21 1337

原创 Go语言 context的源码分析与典型使用(WithCancel,WithTimeout,WithDeadline,WithValue)

文章目录context原理Context基本结构WithCancelWithTimeout,WithDeadlineWithValue代码实现context原理context 主要用来在 goroutine 之间传递上下文信息,包括取消信号(WithCancel)、超时时间(WithTimeout)、截止时间(WithDeadline)、键值对key-value(WithValue)Context基本结构源码中Context接口如下:type Context interface { Deadl

2022-04-04 11:09:42 858

原创 C++ 原子操作(atomic)

1、atomic概述所谓原子操作,就是多线程程序中“最小的且不可并行化的”操作。对于在多个线程间共享的一个资源而言,这意味着同一时刻,多个线程中有且仅有一个线程在对这个资源进行操作,即互斥访问。C++ 11 新增atomic可以实现原子操作2、非原子操作#include <thread>#include <atomic>#include <iostream>using namespace std;int i = 0;const int maxCnt =

2021-06-24 14:23:04 8467 2

原创 go 语言 比较两个切片(slice)、哈希表(map)是否相等

利用reflect.DeepEqual函数判断是否相等package mainimport ( "fmt" "reflect")func slice_demo() { str1 := []string{"123", "hwt"} str2 := []string{"123", "hwt"} str3 := []string{"hwt", "123"} ok := reflect.DeepEqual(str1, str2) if ok { fmt.Println("str1 =

2022-04-26 11:13:53 2671

原创 Go 语言 map源码分析及图解 (二)(map扩容)

文章目录扩容总流程map基本结构及hash值查找流程扩容触发条件新桶创建(hashGrow)桶的数据迁移(evacuate)map基本的结构及查找、写入、删除K/V值的具体分析见上一节扩容总流程在mapassign函数写入K/V值后进行扩容条件判断:(1)负载因子大于6.5,也就是元素总数 / 总桶数 > 6.5时,触发翻倍扩容(2)溢出桶过多,一般发生于持续写入数据又全部删除时,触发等量扩容hashGrow函数负责创建新桶,分配内存空间,注意此时并没有进行旧桶的数据迁移,而是把迁移操作

2022-04-18 11:31:43 966 1

原创 Go 语言 map源码分析及图解(一)(查找、写入、删除K/V值)

map基本结构hmap是map的核心数据结构:type hmap struct { count int // 当前的元素个数 flags uint8 B uint8 // 桶的数量为2的B次方,方便进行哈希的与运算 noverflow uint16 // 溢出桶的数量 hash0 uint32 // 哈希种子,计算哈希值使用 buckets unsafe.Pointer // 桶的数量,为2的B次方 oldbuckets unsafe.Po

2022-04-18 10:59:22 944

原创 Golang for-range 中的指针内存问题

记录一下使用range遍历遇到的bug,想用另一个数组或切片去存储range中的value地址时会储存一样的值,见代码package mainimport "fmt"func main() { arr := []int{1, 2, 3} newArr := []*int{} for idx, v := range arr { fmt.Printf("[idx]=%d,[&v]=%p\n", idx, &v) newArr = append(newArr, &v

2022-03-31 15:28:49 873

原创 C++11 线程池实现

概述1、一个线程 pool,所有线程阻塞等待唤醒(有任务时唤醒)2、任务队列 queue,队列中添加任务后就唤醒线程,线程从队头取走任务执行。典型的生产者-消费者模型。3、mutex对队列上锁, 保证队列任务添加和取走的同步性4、当线程数不足时可以动态增加线程数量。代码threadpool.hpp头文件#pragma once#include <iostream>#include<stdlib.h>#include<thread>#include&

2021-07-27 21:20:54 1153 8

原创 C++ Dijkstra 代码实现

class dijkstra{ public: using pi=pair<int,int>; vector<vector<pi>> map; int n; dijkstra(vector<vector<int>>& edges,int size) { n=size; map.resize(n+1); for(auto& v:edges)

2021-07-22 16:50:40 113

原创 C++ 快速排序实现

#include <iostream>#include <string>#include<vector>#include<algorithm>#include <functional>using namespace std;class Less{public: template<typename T1, typename T2> bool operator()(const T1& a, const T2.

2021-07-12 16:09:58 240

原创 C++ push_back() 和emplace_back() 用法区别

push_bach():首先调用构造函数构造一个临时对象,然后在容器尾部区域利用这个临时对象进行拷贝构造,最后释放临时变量。emplace_back():这个元素原地构造,不需要触发拷贝构造和转移构造。详细测试见代码:#include<iostream>#include <vector>using namespace std;class test{public: int id; test() :id(0) { cout << "默认构造" &

2021-06-29 16:56:25 484

原创 C++ async用法

async概述std::async() 是一个接受回调(函数或函数对象)作为参数的函数模板,并有可能异步执行它们.std::async返回一个 std::future < T >,它存储由 std::async()执行的函数对象返回的值。std::launch 中两个标志位会影响async实现方式1、launch::async异步任务:#include <thread>#include <iostream>#include <future>

2021-06-24 19:41:13 6629 5

原创 C++多线程 async,future, packaged_task , promise用法

1、asyncasync: 启动一个异步线程,可以配合future类来获得返回值#include<iostream>#include<thread>#include<future>using namespace std;int mythread(){ cout << "mythread start,id= " << this_thread::get_id() << endl; this_thread::sleep_

2021-06-23 16:55:47 286 1

原创 C++ 单例模式 代码详解

单例模式单例模式(Singleton Pattern)是 最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。有以下注意的点:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。比如我们在写服务器程序时,日志对象实例就应该是单例模式,下面介绍两

2021-06-22 19:47:12 639 1

原创 C++ 生产者消费者简单模型(C++11 thread)

#include <iostream>#include<thread>#include<vector>#include<list>#include<mutex>using namespace std;class test{private: mutex mut; list<int> li;public: test() {}; ~test() { cout << "~test" <&l

2021-06-22 10:39:35 186

原创 docker mysql主从复制 docker-compose版本

文章目录1. 配置文件准备1.1 主机(master)配置文件1.2 从机(slave)配置文件1.3 docker-compose.yml文件1.4 启动mysql2. 主机操作2.1 进入容器2.2 创建slave用户2.3 获取master status2.4 获取主机ip3. 从机操作3.1 进入容器3.2 设置连接主机参数3.3 开启主从复制4. 测试主从复制1. 配置文件准备文件整体框架如下1.1 主机(master)配置文件vim master/conf/my.cnf[mysql

2021-06-11 20:31:22 296

原创 docker-compose 快速部署mysql数据库

文章目录1. docker安装2. mysql资源拉取(pull)2.1 搜索mysql2.2 查看mysql仓库2.3 下载资源3. 编写docker-compose.yml文件4. 启动 docker-compose.yml4.1 设置后台启动4.2 进入mysql容器内部5. 容器内登陆6. 远程连接登陆1. docker安装docker官网的教程很清晰,一步一步copy运行就行官网教程(针对ubuntu系列)2. mysql资源拉取(pull)2.1 搜索mysqldocker

2021-06-09 14:41:22 826

原创 C++ 最小堆代码实现 详细注释

文章目录概述代码图形化输出堆概述二叉树相关1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树。2、满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值,即每层都是满节点状态。堆1、堆是一颗完全二叉树;2、堆中的某个结点的值总是大于等于(最大堆)或小于等于(最小堆)其孩子结点的值。3、堆中每个结点的子树都是堆树。4、每个堆的堆顶元素必然是堆中所有元素中最大值(最大堆)或最小值(最小堆)下图所示为最小堆:因为是完全二

2021-05-30 20:00:29 933 6

原创 C++ 自定义智能指针shared_ptr

概述(1)理解share的意义,多个智能指针可以共享一份内存空间(通常是new出来的类实例)。(2)体现在shared_ptr的use_count()计数上,每多一个智能指针指向该内存资源,计数就加1,每结束一个智能指针则计数减1。(3)当use_count()为0时,意味着没有任何智能指针指向申请的内存空间,那么就回收此内存资源。详细解释见代码注释代码#include"iostream"#include<mutex>using namespace std;//辅助类tem

2021-05-21 22:04:56 370

原创 C++ 完美转发forward理解

概述完美转发std::forward 实现完美转发,作用就是保持传参参数属性不变,如果原来的值是左值,经std::forward处理后该值还是左值;如果原来的值是右值,经std::forward处理后它还是右值。详细说明见代码注释代码#include <iostream>#include <string>#include<algorithm>using namespace std;//左值引用void process(int& x){ co

2021-05-20 21:32:13 2640 2

原创 linux 安装 redis

文章目录1.安装2.报错检查3. redis.conf文件设置,后台启动4. res-cli客户端连接测试1.安装官网下载最新版本到下载目录下执行解压命令tar -zxvf redis-6.2.3.tar.gz需要检查是否安装gcc,编译出错的话需要升级gcc版本gcc --version执行make指令编译make安装make install安装在/usr/local/bin目录下启动服务redis-server2.报错检查*Warning: Cou

2021-05-10 20:29:31 110

原创 C++ condition_variable用法

概述condition_variable类似于信号量机制,实现了线程的等待和唤醒。函数接口:wait() :阻塞等待的同时释放锁(原子操作),还可以添加阻塞判断函数,详见代码notify_all() : 唤醒所有阻塞等待的线程notify_one(): 唤醒某一个等待的线程代码#include<iostream> #include<thread> #include<mutex> #include<condition_variable&gt

2021-04-20 14:48:57 5063

原创 leetcode 二叉树题类型 根据测试用例创建二叉树 方便调试

复制测试用例数据:[1,2,3,null,null,4,5],根据此用例生成二叉树。代码#include <iostream>#include<string>#include <sstream>#include<vector>#include<queue>using namespace std;struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeN

2021-04-11 16:16:35 870 2

原创 C++ 实现 linkhashmap数据结构

需求分析1.保存插入的先后顺序2.快速查找指定数据解决方案:双向链表 + hash表1.链表采用头插法,那么尾部数据自然就是最早插入的数据2.为了方便删除,采用双向链表3.每插入一个数据,就在hash表中记录位置,方便查找代码实现#include <iostream>#include<unordered_map>#include<set>#include<unordered_set>using namespace std;clas

2021-04-10 17:10:45 366

原创 LFU缓存淘汰算法 双向链表+哈希map

leetcode题目描述解题思路1.每个频率对应一个双向链表,记录对应的key值,如果key对应频率有变化就从此链表中删除2.链表采用头插法,那么尾部数据自然就是最早插入的数据,优先删除3.为了方便删除,采用双向链表4.每插入一个数据,就在hash表中记录key对应链表节点位置,方便查找代码class Node {public: int key; int value; Node* next; Node* pre; Node(int mkey = 0, int mvalue = 0)

2021-04-10 16:53:34 134

原创 LRU缓存淘汰算法 双向链表+哈希map

LeetCode146题思路1.双向链表方便删除操作2.最近使用的资源更新到表头,表尾自然就是长时间未被使用的资源3.资源不够的时候删除表尾代码#include <iostream>#include<unordered_map>using namespace std;class Node {public: int key; int value; Node* next; Node* pre; Node(int mkey = 0, int mvalue =

2021-04-09 17:43:27 96

原创 go 连接Redis数据库 链接池技术

概述(1)提前准备好一定数量的链接,放入到链接池中。(2)Go需要操作redis时,直接从链接池中取出连接使用就可,节省了临时获取redis链接的时间,提高效率(3)链接池中的链接数量应该实现动态增长或减少来满足高并发请求go连接redis数据库基本操作见go连接redis代码实现package mainimport ( "fmt" "github.com/garyburd/redigo/redis")var pool *redis.Poolfunc init(){ poo

2021-04-05 19:40:24 182

原创 go 连接Redis数据库

下载gitgit下载添加环境变量GOPATH目录下测试下载redis库在GOPATH目录下执行此命令go get github.com/garyburd/redigo/redissrc下面会多出github文件代码实现(string)package mainimport ( "fmt" "github.com/garyburd/redigo/redis" //下载的redis包路径)func main(){ //通过go向redis写入读取数据 conn,er

2021-04-05 19:08:53 208

原创 Redis学习记录 基本操作(set)

文章目录概述插入数据sadd显示数据smembers查找数据是否存在 sismember删除指定数据srem概述插入数据sadd显示数据smembers查找数据是否存在 sismember删除指定数据srem

2021-04-04 21:40:16 101

原创 Redis学习记录 基本操作(List)

概述插入lpush从左边插入查看数据lrange0代表从下标为1元素开始取,-1表示全部取完,一直取到倒数第一插入rpush从链表尾部插入取出rpop取出链表头的数据取出lpop取出链表尾的数据链表长度llen索引lindex0返回头结点删除链表del...

2021-04-04 21:09:13 62

原创 Redis学习记录 基本操作(Hash)

文章目录1. 插入hset2. 查看hget3. 查看全部hgetall4. 查看全部hmget5. 同时插入hmset6. 统计hash中有多少字段 hlen7. 判断给定字段是否存在 hexists1. 插入hset2. 查看hget3. 查看全部hgetall4. 查看全部hmget5. 同时插入hmset6. 统计hash中有多少字段 hlen7. 判断给定字段是否存在 hexists...

2021-04-04 20:51:10 124

原创 Redis学习记录 基本操作(string)

文章目录概述切换数据库查看当前数据库数据数量清空当前数据库1.set操作2.删除3.设置超时时间 setex4. mset 同时插入数据5. 同时查看多个键值 mget概述默认有16个数据库,初始默认使用0号库,编号是0-15;支持五大数据类型 : String, Hash, List, Set , zset(有序集合)切换数据库查看当前数据库数据数量清空当前数据库1.set操作2.删除3.设置超时时间 setex数据只存在10s4. mset 同时插入数据5. 同

2021-04-03 21:23:47 151

原创 C++ 动态规划 鸡蛋掉落

题目给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。请你计算并返回要确定 f 确切的值 的 最小操作次数

2021-03-31 16:58:27 487

原创 C++动态规划 经典题 编辑距离

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)示例 2:输入:word1 = “intention

2021-03-30 21:18:56 212

原创 C++ 滑动窗口典型题解

LeetCode 438 找到字符串中所有异位词给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。说明:字母异位词指字母相同,但排列不同的字符串。不考虑答案输出的顺序。示例 1:输入: s: “cbaebabacd” p: “abc”输出: [0, 6]解释: 起始索引等于 0 的子串是 “cba”, 它是 “abc” 的字母异位词。 起始索引等于

2021-03-29 16:21:57 252

原创 C++ 函数传递多参数处理 可变参数模板

1、initializer_list形参如果函数的实参数量未知但是全部实参的类型都相同,我们可以使用initializer_list类型的形参(C++11新标准)initializer_list提供的一些操作:#include<initializer_list> // 头文件initializer_list lst; // 默认初始化,T类型元素的空列表initializer_list lst{a,b,c…}; // 初始化为初始值列表的副本lst2(lst) // 拷贝或赋

2021-03-14 17:47:02 6445

原创 C++ 连接数据库代码

1、配置(1)c++包含库目录(2)链接器附加库目录(3)输入添加依赖项(4)把MYSQL安装目录下的两个lib文件拷贝到项目目录下(5)如果出现无法加载动态库libmysql.dll,则把上述文件也拷贝到C:\Windows\System32目录下2、代码#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<Windows.h>#include<WinSock.h>#incl

2021-03-10 09:45:13 2643

原创 MySQL学习记录 TCL语言的学习(事务控制语言)

文章目录概述1、事务的创建2、设置隔离概述1、事务的创建2、设置隔离2.1 查看隔离级别2.2 保存点

2021-03-05 15:38:03 78 1

原创 MySQL学习记录 DDL语言的学习(数据定义)

文章目录1、创建库2、删除库3、表的创建4、 表的修改4.1 修改列名4.2 修改列的类型4.3 添加新列4.4 删除列4.5 修改表名5、表的删除6、表的复制7、数据类型1、创建库2、删除库3、表的创建4、 表的修改4.1 修改列名4.2 修改列的类型4.3 添加新列4.4 删除列4.5 修改表名5、表的删除6、表的复制只复制表的结构同时复制数据复制部分数据复制部分结构7、数据类型...

2021-03-04 20:54:16 152 1

原创 MySQL学习记录 DML语言的学习1.0 (数据操作)

文章目录1、插入语句1.1 value插入1.2 set插入1.3 select查询2、修改语句2.1 修改单个表2.2 修改多表3、删除语句3.1 单表删除3.2 多表删除3.3 truncate语句1、插入语句1.1 value插入1.2 set插入1.3 select查询2、修改语句2.1 修改单个表2.2 修改多表修改张无忌女朋友手机号为1143、删除语句3.1 单表删除3.2 多表删除删除黄晓明女朋友3.3 truncate语句清空整张表,自增

2021-03-04 16:39:27 56 1

蓝桥杯 基础+算法训练代码(C语言)

自己写的和网上找的一些代码,都通过了蓝桥杯官网训练库100%。个人觉得多做题,然后掌握C++几个STL容器的用法,拿奖是没有问题的。

2020-11-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除