- 博客(80)
- 收藏
- 关注
原创 C++——左值与右值、右值引用、移动语义与完美转发
C++——左值与右值、右值引用、移动语义与完美转发在C++或者C语言中,一个表达式(可以是字面量、变量、对象、函数的返回值等)根据其使用场景不同,分为左值表达式和右值表达式。一、左值和右值的定义左值的英文为locator value,简写为lvalue,可意为存储在内存中、有明确存储地址(可寻址)的数据右值的英文为read value,简写为rvalue,指的是那些可以提供数据值的数据(不一定可寻址,例如存储与寄存器中的数据)二、如何判断一个表达式是左值还是右值(大多数场景)可位
2022-03-22 16:01:47
1772
原创 C++ 模板与泛型知识点
C++ 模板与泛型知识点类模板中,typename和class的区别:1)在类模板声明中,template<class T> class Student;和template<typename T> class Student;没有区别2)什么场景中只能使用typename而不能使用class 在涉及到一个在template中的嵌套依赖类型名的任何时候,需要把单词typename放在紧挨着它的前面 什么叫嵌套依赖类型名? 下面是一个实例:template<
2022-03-22 16:00:06
777
原创 C++程序的内存模型——内存四区相关知识点整理
C++程序在执行时,将内存划分为四个区域:一、代码区存放程序编译后的二进制代码,是共享的、只读的,不可寻址,由操作系统管理二、全局区存放全局变量、静态变量(static修饰的)、常量(包括字符串常量和const修饰的全局变量(又叫全局常量))三、栈区存放函数参数(形参)和局部变量,由编译器自动分配释放,因此要注意不能把局部变量的地址作为函数的返回值,因为当函数运行完成之后,编译器会释放局部变量的内存,此时再访问这块内存就会导致非法操作(但第一次访问可能成功,第二次及之后再访问必失败)
2021-02-02 16:58:28
325
原创 go网络编程——http编程
一、Web工作流程Web服务器的工作原理可以简单归纳为:1. 客户端通过TCP/IP协议与服务器建立连接2. 客户端向服务器发送HTTP协议请求包,请求服务器里的文档资源3. 服务器向客户端发送HTTP协议应答包,如果请求的资源中包含动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端4. 客户端与服务器断开TCP连接。由客户端解释HTML文档,在客户端屏幕上渲染图形效果二、HTTP协议超文本传输协议(HTTP)是互联网上应用最为
2021-01-06 15:29:29
197
原创 go语言网络编程——UDP编程
服务器端:package mainimport ( "fmt" "net")func main() { fmt.Println("UDP Server is listening……") listen, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.IPv4(0, 0 , 0, 0), Port: 30000, }) if err != nil { fmt.Println("listen failed, er
2021-01-05 20:23:33
384
原创 go语言网络编程——TCP编程
一. TCP socket编程go的TCP服务端流程分为三步:(1)监听端口(2)接收客户端请求连接,返回conn(3)创建goroutine处理请求一个实例如下:TCP服务端package mainimport ( "fmt" "net" "bufio")func process(conn net.Conn) { defer conn.Close() //关闭连接 for { reader := bufio.NewReader(conn) var
2021-01-05 19:47:52
578
原创 go语言函数(参数、匿名、defer、异常处理、单元测试、压力测试)
1. go中函数有以下几个特点:(1)可返回多个值,但需用括号将返回值类型括起来(2)参数个数可变,可以理解为切片,使用...表示(3)支持匿名函数和闭包(4)函数本身就是一种类型,可以赋值给变量(5)返回值可以被命名,当返回值都被命名时,return语句之后可以没有参数,比如:func calc(a, b int) (sum int, avg int) { sum = a + b avg = (a + b) / 2 return}但当代码较长时,该
2020-12-02 16:00:57
259
原创 go语言条件语句switch与select
一、switch语句go中switch的几种用法如下面代码示例所示:package mainimport ( "fmt")func main() { var x interface{} //用type-switch语句来判断某个interface变量中实际存储的变量类型 //写法一: switch i := x.(type) { //带初始化语句 case nil: fmt.Printf("x的类型:%T\r\n", i) case int: fmt.Print.
2020-11-26 17:36:55
997
原创 golang实现简易多人聊天服务器
服务器端server.go代码如下:package mainimport ( "fmt" "net")var ConnMap map[string]*net.TCPConn //客户端IP到conn(接收连接)的映射func checkErr(err error) int { if err != nil { if err.Error() == "EOF" { //客户端自己退出了程序 fmt.Println("用户退出") return 0 } fmt.Pr
2020-11-19 15:14:21
254
原创 C++模板
初步学习了C++的模板用法(泛型编程的基础)#include <iostream>#include <ctime>#include <string>#include <vector>#include <cstdlib>#include <stdexcept>#include <fstream>#include <csignal>#include <unistd.h>#inclu
2020-10-08 10:42:08
107
原创 回溯
普通的深度优先搜索(dfs)中,目的一般是寻找问题有没有解即可达性问题,当找到时就可退出递归。而回溯适用于需要找出所有可能的解的情况,比如排列组合问题,例如有 { 'a','b','c' } 三个字符,求解所有由这三个字符排列得到的字符串,这种问题在执行到特定的位置返回之后还会继续执行求解过程。因为 Backtracking 不是立即返回,而要继续求解,因此在程序实现时,需要注意对元素的标记问题:在访问一个新元素进入新的递归调用时,需要将新元素标记为已经访问,这样才能在继续递归调用时不用重复访问
2020-09-17 16:36:54
127
原创 搜索
一、广度优先搜索BFS1. 二进制矩阵中的最短路径 难度:medium Leetcode题号:1091题目描述:思路:典型的BFS,每次向外扩一圈,当第一次到达目标点时即为所求的最短路径长度C++代码如下:class Solution {public: int shortestPathBinaryMatrix(vector<vector<int>>& grid) { if(grid.size() == 0 || gr...
2020-08-27 16:20:15
319
原创 Go语言基础语法——并发
一、goroutine使用go语句可以开启一个新的运行期线程,即goroutine,以一个不同的、新创建的goroutine来执行一个函数,同一个程序中所有的goroutine共享同一个地址空间实例如下:package main import ( "fmt" "time")func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 *
2020-08-27 11:02:49
246
原创 Go语言基础语法——接口和错误处理
Go语言中没有类和继承的概念。Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。一个实例如下:package main import ( "fmt")type Phone interface { call()}type NokiaPhone struct {}func (nokiaPhone NokiaPhone) call() { fmt.Print
2020-08-27 08:58:56
256
原创 Go语言基础语法——map
map中存的是键值对,是无序的,因为map使用哈希表实现的map声明后必须初始化,否则为nil map,不能用来存放键值对实例如下:package main import "fmt"func main() { //var countryCapitalMap map[string]string //声明集合 countryCapitalMap := make(map[string]string) //map插入key-value对,各个
2020-08-26 11:51:02
434
原创 Go语言基础语法——range
go语言中range关键字用于for循环中迭代数组、切片、通道(channel)或集合(map)的元素在数组和切片中它返回索引和索引对应的值,而在map中它返回一个key-value键值对实例如下:package mainimport "fmt"func main() { //使用range去求一个slice的和 nums := []int{2, 3, 4} sum := 0 for _, num := range nums
2020-08-26 10:41:42
399
原创 Go语言基础语法——切片
go中的切片可对标python中的切片,是对数组的抽象,可以理解为动态数组,可通过一个不指定大小的数组来声明一个切片go中切片的几种常用语法的示例程序如下:一、通过make函数定义切片及使用len()和cap()函数实例:package main import "fmt"func main() { ////通过make函数定义切片,第二、三个参数分别是切片初始长度和切片容量 var numbers = make([]int,3,5)
2020-08-26 10:30:13
342
原创 Go语言基础语法——变量、for循环、数组、指针
一、变量及其赋值Go语言中声明的变量必须要使用(除非使用空白标识符_)几种变量赋值方式:var a int = 1var b, str = 2, "abc" //给多个变量并行赋值,且可以通过值进行识别而省略变量类型c := 1 //使用:=赋值的前提是表达式左边必须有一个新声明的变量二、for循环三种写法package main import "fmt"func main() { //三段式循环 var sum i...
2020-08-26 09:34:31
662
原创 Go语言——结构体
一、定义结构体及其三种初始化示例程序:package main import "fmt"type Books struct { title string author string subject string book_id int}func main() { //创建一个新的结构体 fmt.Println(Books{"Go 语言", "www.runoob.com", "Go语言
2020-08-26 09:31:35
180
原创 Python多线程编程——线程池
前言ThreadPoolExecutor是Python对Thread做的进一步的封装,它使得多线程开发变得更简单。另外,它可以让多线程和多进程编码接口一致一、ThreadPoolExecutor线程池使用示例:from concurrent.futures import ThreadPoolExecutor,as_completed,wait,FIRST_COMPLETED#线程池,为什么要用线程池#例如要在主线程中获取一个某一个线程的状态或者某一个任务的状态以及返回值#当一个线程完成
2020-08-13 13:06:34
787
原创 Pyhton多线程——同步
一、使用锁实现同步1. Lock锁import threadingimport timefrom threading import Lock,RLock #可重入的锁#1.用锁会影响性能,获取锁和释放锁都需要一定时间#2.用锁可能会引起死锁total = 0lock = Lock()def add(): global total global lock for i in range(1000000): lock.acquire()
2020-08-06 14:06:26
264
原创 Python多线程——多线程实现和通信
一、多线程实现1、通过实例化Thread类来实现多线程注意setDaemon()和join()等方法的使用,示例程序:#对于IO操作来说,多线程和多进程性能差别不大#1. 通过Thread类实例化import timeimport threadingdef get_detail_html(url): print("get detail html started") time.sleep(2) print("get detail html end")def
2020-08-06 10:36:40
446
原创 二分查找
1. x的平方根 难度:easy Leetcode题号:69题目描述:思路:由于本人太菜,用不了牛顿迭代法(数学大佬们可以看看),故使用二分查找做的这道题,二分查找的初试左端点很好判断,取0就可以,初试右端点需要一定的考虑,我们可以解一个不等式:(a/2)^2>=a,解得a<=0或a>=4,故可以得出结论:大于等于4的整数的平方根都比它的二分之一要小,而本题中0,1,2,3的平方根分别是0,1,1,1,故可以判断一下x的值,只有当x>=4时才需要进行二分查找...
2020-08-04 22:36:24
226
原创 贪心思想
1. 分配饼干 难度:easy Leetcode题号:455题目描述:思路:贪心思想,即将饼干大小和孩子的胃口大小分别排序,将较小的饼干优先分配给胃口较小的孩子,这样才能用较大的饼干尽可能去满足胃口较大的孩子代码如下:class Solution {public: int findContentChildren(vector<int>& g, vector<int>& s) { sort(g.begin(), g...
2020-08-03 19:20:10
187
原创 Python学习第6篇——基本的网络编程
由于还没有接触Python并发编程的知识,故这里的服务器单次只能和一个客户端交互,当断开当前客户端的连接后,其他客户端才可以与服务器交互,下面附上服务器和客户端的代码:server.py:import socketserver_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立套接字server_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #设置套接字选项
2020-07-31 10:39:42
138
原创 TinyHttpd源代码阅读
Tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。下载链接链接:LippiOuYang/Tinyhttpd · GitHub...
2020-07-30 13:07:37
270
原创 排序
一、数组中的第k个最大元素 难度:medium LeetCode题目号:215题目描述:思路:本题目可使用快排或堆排,由于堆排有现成的数据结构(STL的priority_queue,即优先队列,内部由堆实现),实现起来很容易,故这里只谈一下快排的思路假设数组中元素个数为n个,那么找第k大的元素就相当于找第n-k小的元素,由于快排的性质,每次划分后,比基准元素小的元素被划分到基准左边,比基准元素大的元素被划分到基准右边,故可将划分结果分为三种情况:1)基准位置pos==k,说...
2020-07-28 15:04:48
103
原创 Python学习第五篇——json模块
1. 使用json往文件里写入数据和读取数据(dump方法和load方法)dump()方法有两个参数:要存储的数据和存储数据的文件对象load()方法有一个参数:要读取的文件对象2.
2020-07-28 15:04:03
107
原创 Python学习第四篇——文件和异常处理
一、文件1. 从文件中读取数据1)读取整个文件2)逐行读取3)创建一个包含文件各行内容的列表2. 写入文件1)写入空文件(以写入模式打开文件):注意:此写入方式下,若要写入的文件不存在,则会自动创建该文件;若要写入的文件存在,但其中有内容,则会清空其中的内容,然后再写入案例:写入后的testfile文件内容:2)将内容附加到文件(以附加模式打开文件)此方式下,不会清空文件本来的内容,而是将写入的内容附加到文件末尾...
2020-07-23 17:01:22
233
原创 双指针
一、 两数之和 II ——输入有序数组 Leetcode题目号:167 难度:easy题目描述:思路:设置双指针low和high,分别指向两个数中的较小数和较大数,low从数组第一个元素开始,high从数组最后一个元素开始,分为以下三种情况:num[low] + num[high] == target 即找到了满足题目的两个元素,但由于题目要求下标从1开始,故将low和high都加1后存入答案数组,直接退出循环,返回答案即可。 num[low] + ...
2020-06-23 22:23:42
157
原创 Python学习第二篇——分支判断与字典
一、条件测试1)if语句、if-else语句、if-elif-else(可省略最后的else)语句、多个if嵌套用于测试多个条件1. 写完条件后,后面要加冒号2. 多个条件的交集用 and 连接,多个条件的并集用 or 连接2)检查特定值是否包含在列表中1. 检查是否包含:in2. 检查是否不包含:not in...
2020-05-26 20:56:06
253
原创 Python学习第一篇——基本数据类型和列表
一、字符串1.单词首字母大写 title()2. 全部改为大写 upper() 全部改为小写 lower()3. 字符串拼接 +4. 删除字符串开头、末尾、两边的空白 lstrip() rstrip() strip() 该效果是临时的,若需永久更改,则需赋值给原变量二、数值1. **:乘方运算,如3 ** 2 输出92. 使用函数str()可以避免类型错误 如age = 23 输出时用到 + age + ,则会发生错误,可用str(age)...
2020-05-25 08:47:15
232
原创 bfs解决迷宫最短路(输出路径)
题目链接:http://47.110.135.197/problem.php?id=4261AC代码如下:#include <bits/stdc++.h>using namespace std;typedef long long ll;#define N 500001struct Point{ //节点 int x; int y; Point(int x,...
2020-03-21 18:38:13
345
转载 实验1——线性回归
使用工具:jupyter notebook Python3.8数据集来源:https://www.kesci.com/home/project/5da16a37037db3002d441810/code导入库:import numpy as npimport pandas as pdimport matplotlib.pyplot as plt单变量线性回归:问题背...
2020-02-25 15:48:45
2493
原创 拓扑排序问题(判断有向图是否有环)——C++实现
#include <bits/stdc++.h>using namespace std;const int MAXN=500;vector<int> graph[MAXN];//以邻接表(向量形式)组成的图int inDegree[MAXN];//每个点的入度bool TopologicalSort(int n){ //拓扑排序过程 queue<...
2020-02-20 18:59:06
2494
原创 最短路径问题(浙大)——Dijstra算法
题目链接:https://www.nowcoder.com/practice/e372b623d0874ce2915c663d881a3ff2?tpId=40&tqId=21483&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking代码如下:#include <bits/s...
2020-02-18 19:35:01
212
原创 Freckles(Kruskal解决最小生成树问题)——C++实现
题目链接:https://www.nowcoder.com/practice/41b14b4cd0e5448fb071743e504063cf?tpId=40&tqId=21371&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking代码如下:#include <bits/s...
2020-02-16 20:51:46
241
原创 八皇后问题(递归与回溯)
题目链接:https://www.nowcoder.com/practice/fbf428ecb0574236a2a0295e1fa854cb?tpId=40&tqId=21417&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking代码如下:#include <bits/s...
2020-02-12 11:39:46
142
原创 骑士棋盘遍历问题(DFS)
题目大意:找一条能够让骑士遍历棋盘上所有点的路径,若有多条路径,则找出按字母表排序最小的那个解。骑士可以在任何一块方块上开始或结束他的旅行输入:第一行为n,表示案例数第一行至第n+1行,每行两个整数p,qq代表棋盘上每一列依次为第1....q个字母(从A开始),p代表字母编号,也即棋盘的行数,比如p=1,q=3,则棋盘为一行三列,依次为A1,B1,C1代码如下:#inc...
2020-02-11 11:46:21
1196
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人