自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(89)
  • 收藏
  • 关注

原创 Epoller

Epoller

2022-07-31 21:07:44 303 1

原创 CMake入门

CMake

2022-07-31 20:42:08 403

原创 Timer,时间堆

C++服务器,时间堆

2022-07-31 20:39:51 371 4

原创 string_view && span

string_viewstring_view是字符串的视图。C++提供的string效率是有点慢的,因为内存的开辟都在堆上。而C++17的string_view可以提高一些效率。所谓的SV(string_view)就是一个const字符串加上一个长度,你可以读取该字符串,但是你不能修改。class string_view{private: const char* data_; size_t size_;};这玩意也不是什么新东西了,C++17之前,就有人这样搞,因为SV对象只有一个指针和一个

2022-05-06 18:19:35 995

原创 C++17(3)

目录类模板类型推导类模板工作原理moretraps模板元编程技巧如何避免类模板类模板类型推导C++17引入了类模板类型推导(class template argument deduction),针对定义类来说,我们不再需要显式初始化,编译器可以帮助我们自动推导。std::vector v{1,2,3}; //ok !编译器会自动推导出v的类型是std::vector< int >,你可能会觉得这是很自然的,毕竟我们已经有了函数的模板类型推导。接下来我将把类模板类型推导叫做CTAD

2022-02-23 16:27:58 937

原创 C++17(2)

目录fold expressionconstexpr iffold expression虽然C++11引入了可变参数,但是没有引入对可变参数进行操作的语言支持。所以在C++17之前,我们只能使用旧的语言特性来解决。我们常使用递归和初始化来解决可变参数的解包问题。void print(){} //处理边界template <class First, class ... Rest>void print(First first_arg, Rest...rest_args){ co

2022-02-20 00:13:45 325

原创 C++17 (1)

目录if-initStructured Bindingsif-initC++17新增,变量可以在if条件表达式内初始化,//before C++17int p = do_something();if(p){ //...}//nowif(int p = do_something(); p){ //...}如果你的变量p仅仅在if范围内使用,那么就可以使用if-init。这样做的好处就是控制了p的生命周期和作用域,一旦离开if语句,p立刻销毁,提高了一点效率,而且你可以在下面的代码

2022-02-17 21:21:26 400

原创 type_traits之 析取 && 合取 && 否定

前言析取,disjunction合取,conjunction否定,negation

2022-02-14 17:30:54 764

原创 C++20 concept && constraint

目录前言C++20之前的做法前言C++20引入了concept,对模板参数提供约束。因为模板的接口都是隐式接口,模板的要求也是隐式的,需要你深入模板去查看模板究竟需要哪些限制。而concept显化了对类型的限制,在编译期就将不满足的实例化剔除。假设我们想要用可变参数实现一个sum求和函数,求若干个对象的和,像下面这样:template <class...Args>auto sum(Args ... args) noexcept{ return (... + args); //C+

2022-02-03 12:34:27 1206

原创 C++重载决议

目录前言一些与overload易混淆的概念override运算符重载为什么需要重载决议?声明函数重载什么是重载决议?什么不是函数重载?重载决议之过程函数重载 && 函数模板before 重载决议more detailstype conversion(类型转换)rank(排名)其他两个排名解决ambiguous function call当最佳匹配不是你想要的前言这篇博客用来总结overload resolution,这是一篇关于重载决议的演讲,very nice。一些与overload

2022-01-31 14:34:59 1990 5

原创 C++ template Metaprograming

目录前言value traitstype traits模板元函数使用类型参数使用类型作为 ”返回值“前言什么是metaprograming ?利用编译器来进行编程的手段。模板元编程是元编程的一种。利用模板的实例化机制,来实现编译器计算。模板元编程之作用:提高代码的灵活性。提高运行期的效率。模板元编程即将运行期的工作移到编译期完成。这是需要代价的,即编译期时间增加。换来的就是运行期的效率。notice:在模板元编程中,牢记:你的程序的run-time == compile

2022-01-16 14:14:39 630

原创 mysql数据类型

目录整形浮点数字符串时间其他整形整形数据也分为有符号和无符号。数据库对数据有严格的约束,一旦越界,就无法插入数据,不像C语言可以转换。tinyint:占1个字节的整数。int:4个字节。bigint:8个字节。bit类型:使用方法:bit(M)。M表示二进制的长度,就是一串二进制数字而已。如果不写M,默认M是1.bool类型:常用0表示假,1表示真。浮点数decimal(m, n):浮点数也有float,double类型,而且也分为有符号和无

2022-01-03 17:57:44 716

原创 mysql基础

目录why数据库?mysql数据库mysql的结构why数据库?数据库,用来管理数据。包括数据的增删查改等等操作。数据库的本质其实就是对文件的增删查改而已。但是为什么需要数据库呢?我们直接写进文件不就ok?不便于管理。不安全。在文件和使用者之间加上一层(即数据库),保护数据安全性,这也是软件设计重要理念之一。自己手工控制,难以解决海量数据。mysql数据库我也不做多余的废话,直接说重点内容。mysql数据库是数据库的一种,因为其高效,免费,使用的范围很广。mysql的服务端

2021-12-30 17:41:02 850

原创 模板基础(1)

目录member templatemember template

2021-12-18 20:41:12 140

原创 Class Template

template <class T>class Stack{private: std::vector<T> elems; // 元素public: Stack(); // 构造函数void push(T const&); // push 元素void pop(); // pop 元素T top() const; // 传回最顶端的元素};该类的名字是Stack,构造和析构函数使用类名。该类的类型是Stack,如果你想定义对象之类的动作,使用的都是St

2021-12-13 16:50:39 547

原创 Function Template

模板形参前面的typename可以换成class。typename是C++晚期才出现的。这里的class与我们常说的类没有关系,只是声明模板参数。不能换成struct。利用域操作符操控全局变量 or 函数。int value = 1;int main(){ int value = 1; ::value = 2; //改变的是全局的value return 0;}模板会被编译两次,(隐含着模板在编译期实例化)不实例化,只是对 template 程序代码进行语法检查..

2021-12-13 15:43:00 194

原创 给operator=返回引用

Scott Meyers说,如果没有必要,那么你的操作符重载要与内置类型保持高度一致性。当你实现操作符重载时,你应该想一想,内置类型是否支持这样做?内置类型还支持怎样做?C++的内置类型支持连续赋值,像下面这样,int x = 0, y = 1, z = 2;x = y = z = 3;所以你重载的operator=应该允许连续赋值。所以你的operator=应该返回引用。class MyClass{public: MyClass& operator=(const MyCla.

2021-12-13 13:03:44 818

原创 在operator=中处理自我赋值

目录注意自我赋值证同测试自我赋值安全问题异常安全问题copy-and-swap技术注意自我赋值证同测试自我赋值安全问题异常安全问题copy-and-swap技术

2021-12-12 22:45:06 314 1

原创 尝试写出一个不带有异常的swap

目录std::swap在类内实现swap,然后特化std::swap调用之不要向std中增加东西为你的class(非模板)补上特化的std::swap让member版的swap远离异常C++11之"移动拷贝"版本的swapstd::swapswap是一个很常见的函数,用来交换两个变量的值。而且swap也可以用来处理赋值函数中的异常安全问题。当然,这取决于swap函数本身不会抛出异常。swap函数的实现通常是这样的:template <class T>void swap(T&

2021-12-12 21:09:52 379

原创 为多态基类声明virtual析构函数

EffectiveC++条款7

2021-12-11 22:07:39 358

原创 EffectiveC++条款26

26,尽可能延缓变量的定义时间当我们定义一个对象,就要承担构造函数的成本。当我们销毁该对象,就要承担对应的析构函数的成本。你可能会说,我定义一个变量,怎么会不使用呢?(我也是这样想的。)但总会有特殊情况。延缓变量定义时间考虑下面的代码:class Solution{public: void test(int lenth){ using namespace std; vector<int> v(5); if(lenth < 0){ throw exce

2021-12-09 17:41:57 635

原创 再谈operator new && operator delete

目录前言void* operator new(size_t)void operator delete (void*)void* operator new(size_t ,const std::nothrow_t&)void operator delete (void*, const std::nothrow_t&)void* operator new(size_t, void*)void operator delete (void*, void*)前言一开始我发现了一道关于定位new(p

2021-12-08 20:06:40 2057

原创 多路转接epoll

目录epoll的相关系统调用epoll的原理epoll的优点epoll代码epoll的工作方式水平触发,LT边缘触发,ETLT vs ETepoll的相关系统调用epoll的原理epoll的优点fd越多,效率越高!!epoll代码epoll的工作方式水平触发,LT边缘触发,ETLT vs ET...

2021-12-05 16:12:40 1167 1

原创 多路转接poll

文章目录pollpoll和select一样,poll也是一种就绪事件通知方案。poll也只有一个作用就是等。poll解决两个select的问题:poll没有上限。poll将输入和输出利用变量做了分离。所以每次循环都不需要再次进行重新添加。...

2021-12-04 12:01:12 249

原创 多路转接select

目录五种IO模型理解5种IO模型的基本概念,重点是IO多路转接。掌握select编程模型,能够实现select版本的TCP服务器。掌握poll编程模型,能够实现poll版本的TCP服务器。掌握epoll编程模型,能够实现epoll版本的TCP服务器。理解epoll的LT模式和ET模式。理解select和epoll的优缺点对比。五种IO模型...

2021-12-03 18:48:31 553

原创 数据链路层 && 一些其他的协议or技术

目录局域网以太网以太网帧格式ARP协议网关(getway):从一个网段到另外一个网段,可能要进行协议转换,而网关就负责协议转换。现在,网关一般是路由器的IP地址。默认网关:一般是路由器的IP地址。我们说到IP协议可以帮助我们将数据从一台主机发送到另外一台主机,但实质工作的是数据链路层的以太网协议,IP协议具有宏观指导作用。MAC地址用来控制下一跳的位置,IP地址用来指明最终方向。局域网栗子:我在一间有很多学生的教室中跟张三讲话,那么别的同学也有可能互相聊天。别人就可能打扰到我和张三,而我们

2021-11-28 18:54:39 2210 2

原创 网络层 && IP

目录IP协议IP协议

2021-11-28 15:46:36 2003

原创 传输层 udp && tcp

目录再谈端口号netstatpidofUDPTCPTCP其他问题再谈端口号netstatpidofUDPTCPTCP其他问题

2021-11-22 19:18:51 1806

原创 http(2)

目录http && https对称加密非对称加密中间人攻击http && httpshttps大部分内容和http一样,https可以理解为对http的一层封装。https在应用层和传输层之间增加了一层SSL/TLS,用来加密和解密数据,保护用户的信息。即,用户的数据在发送之前由SSL层进行加密处理,发送到目标主机后再由SSL进行解密处理。有得必有失,https更高的安全性所带来的损失就是效率,所以https的效率一定比http要低。对称加密密钥:某个用来

2021-11-18 16:24:08 105

原创 https(1)

重点理解应用层的作用,初始HTTP协议。理解传输层的作用,深入理解TCP的各项特征和机制。对整个TCP/IP有系统的理解。对TCP/IP协议体系下的其他重要协议和技术有一定的了解。学会使用一些分析网络问题的工具和方法。...

2021-11-18 15:00:31 8424

原创 socket done

目录inet_ntoa创建连接tcp的3次握手4次挥手。socket和open#include <functional>typedef std::function<int(int, int)> handler;C++11定义函数指针。inet_ntoainet_ntoa不是线程安全的。使用创建连接客户端和服务器要创建对应的数据结构,要花费空间和时间(TCP)。tcp的3次握手4次挥手。TCP建立链接的原理是三次握手。客户端先发送有SYN的报文,请求链接,

2021-11-14 18:46:29 1982

原创 socket(2)

服务器需要绑定端口号,但是客户端不需要绑定,这是为什么?客户端不需要绑定端口号和ip,但是客户端也有自己的端口号和ip。一台电脑有很多个客户端,如果你想要客户端强行绑定端口号,那么就需要所有的公司进行协商,每个客户端使用不同的端口号。但这是不可能的。如果你强行让客户端绑定端口号,那么就极有可能引起冲突,使得某些客户端启动失败。但是服务器不一样,因为服务器一般只有一个,而且服务器一般是一个公司内部的东西,可以协商。而且服务器的端口号和ip地址必须是确定的,众所周知的,因为一台服务器连接着很多客户端,否

2021-11-09 22:57:37 2494 1

原创 socket(1)

目录理解源IP地址和目的IP地址套接字本质上就是进程间通信。认识IP地址,端口号,网络字节序等网络编程中的基本概念。学习socket、api的基本用法。能够实现一个简单的udp客户端/服务器。能够实现一个简单的tcp客户端/服务器(单连接版本,多进程版本,多线程版本。)理解tcp服务器建立连接,发送数据,断开连接的流程。接口都是系统调用接口,程序都是用户级程序。自定义协议,所有接口都是传输层接口。 应用层接口,使用传输层接口。理解源IP地址和目的IP地址在IP数

2021-11-06 13:40:18 263

原创 计算机网络基础

目录认识"协议"认识"协议"""协议"是一种约定。

2021-10-30 13:03:14 3314

原创 leetcode-201_2021_10_17

leetcode-201_颠倒二进制位法一:经典做法,也是最简单的做法。创建一个新的对象ret来维护颠倒后的结果。遍历n的32位,如果第i位为1,那么ret的第(31-i)位为1。有一个小细节就是如果n的最高位的1已经被遍历,那么就可以提前结束,因为后面全是0。class Solution {public: uint32_t reverseBits(uint32_t n) { uint32_t ret = 0; for(int i = 0; i < 32

2021-10-17 13:42:55 95

原创 java中的HeightOneBit函数

我在leetcode中看见了一个有意思的函数,即java中的HeightOneBit函数。该函数接受一个整数,保留该整数的二进制最高位的1,其他的位清0。由于我对java不了解,我写了一份C++的版本。int HeightOneBit(int i){ i |= (i >> 1); i |= (i >> 2); i |= (i >> 4); i |= (i >> 8); i |= (i >> 16); r

2021-10-17 12:53:52 186

原创 leetcode_191_2021-10-15

leetcode_191_位1的个数这是一道很简单的题目,这里我要介绍对它的优化解题方案。法一:直接遍历32位,利用位运算找到有1的位,然后利用oneNums来维护。class Solution {public: int hammingWeight(uint32_t n) { int oneNums = 0; for(int i = 0; i < 32; ++i){ //直接遍历n的每一位 if((n >> i) &

2021-10-15 18:11:44 153

原创 leetcode1720_2021-10-14

leetcode1720_解码异或后的数组这是一道非常简单的题目。写这篇博客的目的主要是介绍一下异或符号的特性。关于异或运算的几条基本定理:异或满足结合律,(a ^ b) ^ c = a ^ (b ^ c)异或满足交换律,a ^ b = b ^ a任意数与自身异或得0,a^a = 0任意数异或0的到自身,a^0 = a那么encoded[i] = arr[i] ^ arr[i + 1],则有 arr[i + 1] = encoded[i] ^ ar[i].class Solution {p

2021-10-14 10:50:37 57

原创 leetcode1863_2021-10-14

leetcode1863 找出所有自己的异或总和再求和法一:数组中的每个数字有选取和不选取两种状态,设数组大小为n。我们使用一个整数的前n位来模拟每个子集的选取状态,这个整数的大小由0(空集)到 (1 << n) - 1(全集)。然后我们再遍历数组,同时检查这个整数的该位,如果为1,就异或上该位;为0则直接跳过。class Solution {public: int subsetXORSum(vector<int>& nums) { int

2021-10-14 10:39:46 86

原创 leetcode_1365

leetcode_1365有多少小于当前数字的数字:法一利用条件每个nums[i] <= 100,可以创建一个101空间的频率数组,利用计数排序算出每个数字出现的频率。然后小于当前数字的数字个数就是频率数组中以该数字为下标的前面的所有项数和。class Solution {public: vector<int> smallerNumbersThanCurrent(vector<int>& nums) { vector<int>

2021-10-12 23:39:28 109

空空如也

空空如也

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

TA关注的人

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