常见算法合集
前言这些是2020-2021刷题、面试积累的常见算法模板(不含dp)。大部分有对应的leetcode原题。
二分二分模板大概有俩类,总计四个。
种类一当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
左边界123456789101112131415int left_bound(vector<int>& nums, int target) { // 找左边界 int left = 0,right = nums.size() - 1,mid; while(left <= right) { mid = left + ((right - left) >> 1); if(nums[mid] == target) { right = mid - 1; // 右边向左边移动一位 }else if ...
cpp实用小技巧
assert & static_assert问题来源:statkoverflow What is the difference between assert and static_assert?以下回答是对其的翻译
问题描述我知道static_assert 是发生在编译期,assert是发生在运行时,那他们有什么不同呢?为什么不能使用if来检查呢?同样的问题我可以使用
1234if(condition == false) { print(message); exit();}
有什么例子是只能使用assert或者static_assert的呢?
明明使用if更为简单为什么不实用if呢?
answer
只能使用static_assert的情况
但程序中的逻辑需要在编译期检查是否存在问题时,只能使用static_assert,因为此时if和assert还不能运行。
使用assert的情况
当你需要检查运行时代码是否有应该返回为一值的地方返回了预期之外的值,例如你要检查某个时刻某个位置的pointer的值是否为null,这个时候应该使用assert,为什么 ...
GRPCrouteGuide
installgrpc在19年后go语言的编译插件改了,原本的– plugins = go的编译插件不能用了,必须使用新的编译插件。
安装相关插件12go install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
不出意外这些插件会出现在**$(GOPATH)**里面,但是不知道为什么我的GOPATH不起作用,后面把相关插件移动到了
1/usr/local/bin
一般而言GOPATH在home/go这个路径。
安装grpc1brew install grpc
12345cd /usr/local/Cellar/grpc/1.41.0/binlsgrpc_cli grpc_node_plugin grpc_python_plugingrpc_cpp_plugin grpc_objective_c_plugin grpc_ruby_plu ...
protocbufferRouteGuide
Protocol Buffer route guide文章主要内容为介绍使用golang protocol buffer的安装与使用,参考资料有ProtocolBuffer,GRPC route guide。
安装可以去protoclbuffer官网直接下载安装,也可以使用homebrew这类工具直接安装。
1brew install protoc
此时安装好的是通用件,之后我们再来安装golang的编译插件protoc-gen-go
1brew install protoc-gen-go
或者是使用golang自带的工具进行安装
1go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
基础使用基本控制1234syntax = "proto3"; // 指定版本协议,此处使用的是3的协议package tutorial; // 指定包名,golang中似乎不起作用import "google/protobuf/timestamp.proto"; //导入相关文件,支持分 ...
golang实战笔记2
go语言实战第三章读书笔记 - 打包和工具链包包名 给包名取名字的惯例是包名与目录名相同,我们以net/http包为例,http文件夹下的所有文件都属于http包,并且名字简洁全都是小写,这样为了开发时方便。虽然导入包后名字通常以包名.函数名的方式引用包内容,但实际上并不要求所有包的名字都不相同,一来是在import中可以使用路径名来确定为一包,二是在导入后可以对包名重命名,这样可以有效的区别不同路径的同名包。
导包 通常情况下我们导入系统包是直接”packagename”的形式导入。
1234import ( "fmt" "strings")
此时编译器是根据go环境变量设置的路径导入的,包的搜寻路径如下:
123# usr/local/go/src/pkg/ 标准库# /myproject/src/ 工作目录# /home/mylibraries/src 指定的库目录
远程导入是的,go语言还支持分布式导入包,例如可以使用以下形式来导入包
123import ( "github.com/username/rep ...
golang实战笔记1
go语言实战第二章读书笔记包包名 每个文件都必须一个包里面,通常来说包名和文件夹名相同,也就意味着一个文件夹下面的所有文件的包名必须相同的。
例如有以下目录结构
1234567891011sample├── data│ └── data.json├── main.go├── matchers│ └── rss.go└── search ├── default.go ├── feed.go ├── match.go └── search.go
那么以search文件夹为例,文件夹中的文件的包名都应该如下
1package search
Main包 main函数会在main包里面出现,同理,main函数是go语言程序的入口地点。但是go语言包中还有另一个函数init()函数,init函数用于初始化整个包,因此假如main包中有init函数,也会先执行init(所有使用到的包中的init,顺序是导入包,初始化包,本包,并非只是main的init)函数在执行main函数。
假如main包中没有main函数,那么构建出来 ...
libeventepoll.c源码剖析
版本并未选用最新的2.1.12stable,而用的是1.4.15stable。
首先定义了一个evepoll结构体,这里官方也给出了注释,大意是由于epoll的接口限制,我们需要手动的追踪所监听的事件类型
123456/* due to limitations in the epoll interface, we need to keep track of all file descriptors out self. */struct evepoll { struct event* evread; struct event* evwrite;};
然后顺带看一下struct event结构体的定义
12345678910111213141516171819202122232425262728293031323334struct event { // 事件队列 链接到event_base.eventqueue TAILQ_ENTRY (event) ev_next; // active队列 链接到event_base.acti ...
libevent信号检测
libevent可以检测系统信号,我们这里以检测SIGINT为例
123456789101112131415161718192021222324#include "common.h"#include "event_config.h"#include "event_base.h"#include "event_signal.h"using namespace std;using namespace echo;int two_sum(int a,int b){ std::cout<<"a + b = "<<a+b<<std::endl; return a+b;}int main() { Callback<int>two(two_sum,10,20); auto methods = event_get_supported_methods(); std::shared_ptr<Bas ...
libevent可运行程序
环境搭建由于一开始在Macos上安装lib event遇到了一点小问题,后改用在ubuntu上安装并成功运行事例代码。之后又觉得不能放弃Mac上的环境搭建,于是开始折腾如何安装libevent。
安装C++通用包管理器vcpkg是一个跨平台的C++包管理器,有了它可以很方便安装各种包
安装vckpg首先编译安装vcpkg
vcpkg卡在下载Cmake…
使用clashX开启终端代理,成功安装vcpkg
之后
12./vcpkg serach libevent./vcpkg install libevent
libevent安装完成
初步使用libevent封装event_baselibevent存在类似于libcurl中的curl这种全局资源,因此使用RAII对其进行初步封装,以便实现资源的自动管理。
设置evconnlistener此函数用于设置感兴趣的事件,监听的端口已经base,回掉函数等参数。
回掉函数由于libevent使用的是C语言,回掉函数的类型其实已经写死了,但是我们可以通过回掉函数设置的参数来传递我们自动的funtion和arg。以下是默认的回掉函数定义
1void ...