C++实现一个String类
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576#include <bits/stdc++.h>class String {public: String(const char *str = nullptr); String(const String &other); String(String &&other); ~String(); String &operator=(const String &other); String &operator=(String &&other);private: char *m_data;};String::String(const char *str) { if (str == nullptr) ...
字符串拼接常见问题
12s += "hello"s = s + "hello"
s += “hello” 是使用原地加法操作符,它会直接修改原有的字符串对象(如果 s 可变的话)。s = s + “hello” 是创建一个新字符串的过程,首先计算右侧的表达式 s + “hello”,然后将结果赋值给 s。这个过程涉及到更多的内存分配。对于较长的字符串拼接,s += “hello” 通常会比 s = s + “hello” 更高效,因为它可能会在原地修改而不是每次都创建新的对象。
双Buffer解决读写冲突问题
方法一针对一写多读场景,可以使用智能指针代替锁
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include <iostream>#include <vector>#include <map>#include <memory>#include <atomic>#include <thread>void LoadMap(std::shared_ptr<std::map<int, int>> map_ptr) { std::cout << "LoadMap" << std::endl; for (int i = 0; i < 10000; i++) { (*map_ptr)[i] = (*map_ptr)[i] + 1; ...
红黑树的学习
红黑树的应用
10亿数据不到30次比较就可以查找到目标
C++ map set
JDK1.8 HashMap 冲突的链表长度超过8时,自动转为红黑树
Linux底层的CFS进程调度算法,vruntime使用红黑树进行存储
多路复用技术的Epoll,核心结构是红黑树+双向链表
二叉查找树BST
左子树上所有结点的值均小于或等于它的根结点的值
右子树上所有结点的值均大于或等于它的根节点的值
左、右子树也分别为二叉排序树
平衡二叉树AVL
AVL树中任何节点的两个子树的高度最大差别为1
红黑树
牺牲部分平衡性,以换取插入/删除操作时较少的旋转操作
节点被标记为红色和黑色
红黑树特性
节点非黑即红
根节点一定是黑色的
叶子节点一定是黑色
每个红色节点的两个子节点都黑色 -> 每个叶子到根的所有路径上不能有两个连续的红色节点
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点 -> 如果一个结点存在黑色结点,那么该结点一定有两个子节点
红黑树的插入一般插入红黑树节点时,会将节点设置为红色,因为红色破坏原则的可能性最小。
红黑树为空树直接把插入结点作为根节点 ...
加密算法学习
对称加密算法
DES
AES
非对称加密算法
RSA
ECC
属性加密ABE
CP-ABE算法
KP-ABE算法
普通公钥加密和CP-ABE属性加密的区别假设需要对某个文件进行加密,然后发送给5个用户,如果使用公钥加密的方式。
普通公钥加密需要使用5个用户的公钥进行5次加密,然后再把加密后的文件发送给5个用户,过程需要5个加密文件,每个用户使用自己的私钥进行解密。
CP-ABE属性加密只需加密一次文件,符合属性的人就可以进行解密。
保序加密
OPE映射思想,随机分布
同态加密
Paillier
编程规范学习
1. 圈复杂度圈复杂度V(G),也成为条件复杂度,是一种衡量代码复杂度的标准,圈复杂度可以用来衡量一个模块判定结构的复杂程度。
1.1 圈复杂度的标准一般来说,圈复杂度大于10的方法存在很大的出错风险。小于10代表代码清晰、结构化,可测性高,维护成本低。
1.2 圈复杂度计算方法
点边计算法
圈复杂度由程序的控制流图来计算。
正常顺序的圈复杂度为1;if else 的圈复杂度为2;while 的圈复杂度也为2。
节点判定法
圈复杂度 = 判定节点的数量 + 1
V(G) = P + 1
常见的判定节点{ if, while, for, case, catch, and, or, ?: }
1.3 Eample 计算圈复杂度V(G) = 14
123456789101112131415161718192021222324252627282930U32 find (string match){ for(auto var : list) // +1 { if(var == match && ...
Mysql 索引简述
什么时间需要建立索引?
经常用于 where 查询条件的字段
字段有唯一性限制的,比如商品编码
经常用于 group by 和 order by的字段,这样查询时不需要在此排序。
索引优化方法?
前缀索引优化 针对某个字段中的前几个字符建立索引
覆盖索引优化 覆盖SQL query的所有字段,从二级索引中直接查询到记录,避免回表。
索引失效的情况?
使用模糊匹配的时候,也就是 like %xx 或者 like %xx%
在查询条件中对索引列做了计算、函数、类型转换等操作
联合索引要能正确遵循最左匹配原则
在WHERE子句中,如果OR前的条件是索引列,而在OR后的条件列不是索引列
联合索引相关问题?创建了一个 (a, b, c) 联合索引,哪些语句可以匹配?
where a=1;
where a=1 and b=2 and c=3;
where a=1 and b=2;需要注意的是,因为有查询优化器,所以a字段在where子句的顺序并不重要。
where b=2;
where c=3;
w ...
C++ STL 相关知识点
map
基于红黑树实现,红黑树的每个节点存储一个pair对象。
键值对按照键的顺序排列。
插入、删除、查找操作的平均时间复杂度为O(log n)
unordered_map
基于哈希表实现。键值对在容器中的位置是由键的哈希值决定。
插入、删除、查找的平均时间复杂度为O(1)
如何解决哈希冲突multimap
key值可以重复出现
畅学锁
1. 操作系统中的常见锁1.1 互斥锁 & 自旋锁
基础
互斥锁和自旋锁是最底层的两种锁。
互斥锁加锁失败后,线程会释放 CPU ,给其他线程。
自旋锁加锁失败后,线程会忙等待,直到它拿到锁。
什么时候使用互斥锁,什么时候使用自旋锁?
互斥锁加锁失败后,会从用户态陷入到内核态切换线程,虽然简化了使用锁的难度,但是存在一定的性能开销成本,即两次线程上下文切换的成本。如果能够确定能够在短时间内获取到锁,就不应该使用互斥锁,而是使用自选锁。
单核CPU不能使用自选锁,因为自选的线程永远不会放弃CPU。
1.2 读写锁
当写锁没有被线程持有时,多个线程能够并发地持有读锁。
一旦写锁持有后,获取读锁的操作会被阻塞。根据实现的不同,读写锁可以分为 读优先锁 和 写优先锁,但是有可能造成读写饥饿。
1.3 悲观锁 & 乐观锁
悲观锁:访问共享资源前,先上锁。
乐观锁:先修改共享资源,再验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作。乐观锁全程不加锁。只有在冲突概率非常低,且加锁成本非常高的场景时 ...
HTTPS 相关内容总结
HTTPS常见的状态码?
1XX:提示信息,表示目前是协议处理的中间状态,还需要后续的操作
2XX:成功,报文已经收到并被正确处理
3XX:重定向,资源位置发生变动,需要客户端重新发送请求
4XX:客户端错误,请求报文有误,服务端无法处理
5XX:服务端错误,服务端在处理请求时发生了错误
HTTP1.0 1.1 2 3 演变HTTP 1.1 vs 1.0
长连接改善短链接的性能开销
支持管道网络传输:只要请求发出去了,不必等待其回来
长连接的问题
占用资源
长连接期间会使负载均衡失效
HTTP 2.0 vs 1.1
头部压缩
二进制格式
并发传输多路复用:解决队头阻塞的问题
服务器主动推送资源
HTTP 3.0 vs 2.0
QUIC:UDP的优势
握手过程总结TCP握手过程
客户端随机初始化序号,并将此序号置于TCP的首部的序号字段,同时将SYN标志位置为1,表示SYN报文。接着将第一个SYN报文发送给服务端,表示向服务端发起连接。
服务端收到客户端的 SYN 报文后,服务端也初始化自己的序号,将此序号填入TCP的序号字段中,其次把TCP的确认应答号字段填入(server_ ...