leetcode错题
707 Design Linked List错因:思考不完善,对于双链表,如何判断达到尾节点、插入索引的范围是多少(0到size都行)、删除索引的范围是多少(0到size-1)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970struct _node{ int val; _node *prev; _node *next; _node(int val):val(val){};};class MyLinkedList {private: _node *node; unsigned int size; _node* find_index(int index){ _node *temp = node; for(int i = 0; i <= inde ...
C++对象模型
什么是C++对象模型分为两类,其一是语言中直接面对程序设计的部分,其二是各种底层的实现机制。(相当于一个是怎么用,一个是如何实现的吧)。
底层实现其实会随着编译器的不同而变化的。
关于对象布局成本(是存储成本吗?)从c到C++,一个很大的变化是加了封装,数据和函数都放到同一个对象内,但这其实并没有增加多少布局成本,由于函数虽然声明在对象中,但编译器不会把那些函数的代码存放到对象中,而且每个函数只会有一个代码实例。C++在布局和存储时间上的主要开销是由virtual引起的:
virtual function机制,用来支撑执行期绑定
virtual base class,用来实现多次出现在继承体系中的基类,有一个单一而被共享的实例
C++对象模式C++中有两种类成员:static与non-static,有三种类成员函数:static、non-static与virtual。
C++对象模型非静态数据成员放到每一个对象中,静态数据成员,静态和非静态的函数放到其他地方。虚函数通过vtbl和vtpr实现。每一个对象有一个指针(vptr)指向vtbl。
关键字带来的差异为了支持C的声明操作, ...
STL源码剖析
1. 空间分配器 Allocator1234567891011121314151617template <class T>class allocator {public: typedef T value_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; // rebind allocator of type U template <class U> struct rebind { typedef allocator<U> other; };};
模板类中使用了模板类,使得我们可以通过一个已经实例化的
new操作包含了o ...
csapp1
中断:cpu外部的io设备的信号的结果
陷阱、故障、终止:当前指令的结果
陷阱,就是系统调用,通过异常这个接口让内核处理某种工作。
故障(fault),可被修复的情况,修复了就返回程序,修复不了将进入内核的abort例程,例如缺页异常。
终止,不可恢复的情况,进入到abort例程,该例程会终止程序。
常见异常号:
异常13,使用了未定义的虚拟存储器区域,写一个只读文件,等都会导致异常13,一般报告为Segmentation Fault
研究生自救指南.md
[**研究⽣⾃救指南由B站Up,⽔论⽂的程序猿,https://space.bilibili.com/383
研究⽣⾃救指南
⼀、引⾔
研究⽣的处境
研究⽣的基调
写这份指南的动⼒
⼆、第⼀个暑假规划
引⾔
未找导师
已找导师
未定⽅向
已定⽅向
总结
三、毕业⽬标的选择
为什么要定⽬标
主要⽬标分类
考公
考编
⺠办⾼校
国央企
⼤⼚
中⼩⼚
读博
没有毕业⽬标选哪个⽬标好
⼀定要有毕业⽬标吗
对于⽬标种类的选择
总结
四、如何选合适的导师
引⾔
导师类型简介
学术型
项⽬型
半放养型
指导型
纯放养型
如何选合适的导师
总结
五、与导师的相处
示弱
为什么示弱
如何示弱
示弱的副作⽤
交好
为什么交好
如何交好
沟通
和导师之间的沟通
和辅导员之间的沟通
和师兄姐之间的沟通
莫较真
⽃争
总结
六、选错了导师怎么换
什么是互选
互选前
⾮必要不换导师
以德服⼈和装可怜
互选后
怎 ...
webserver
serverrrrrrrrrrrrrrrrrrrrrr–
IO 多路复用 VS 多进程/多线程IO 多路复用不用维护线程进程,大大减小了系统的开销。
多路复用的实现主要基于 select、poll、epoll
select12345#include <sys/select.h>#include <sys/time.h>int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);// return:表示此时有多少个监控的描述符就绪,若超时则为0,出错为-1。
调用过程:
1)用户进程需要监控某些资源 fds,在调用 select 函数后会阻塞,操作系统会将用户线程加入这些资源的等待队列中。
2)直到有描述副就绪(有数据可读、可写或有 except)或超时(timeout 指定等待时间,如果立即返回设为 null 即可),函数返回。
3)select 函数返回后,中断程序唤起用户线 ...
cmake的使用
cmakeeeee
1.一个简单的CMake项目
cmake 支持大写,小写,混合,建议小写
每个CMake项目顶层文件夹都有cmakelists.txt文件,最简单的cmakelists.txt可以只包含三条命令。如下:
cmake_minimum_required(),这指定了最低的版本,
project(),指定了项目的名字以及其他信息
add_executable(),告诉cmake使用特定的源文件创建可执行文件
指定c++标准
两个特殊的用户可设置变量,分别是
CMAKE_CXX_STANDARD
CMAKE_CXX_STANDARD_REQUIRED
可以通过指定这两者来指定需要的C++标准
添加版本信息&配置头文件
有时候在cmakelists.txt定义一个变量,然后在.c文件使用,这是很有意义的,如何实现:
使用配置头文件,
install_and_uninstall
make install, make程序会按照命令执行安装
通过make安装软件分为如下几个部分:
下载源码,github之类的
配置,通常下载的源码(tar.gz)有些配置文件,比如 configure, cmakelists.txt等,可以传递参数来自定义安装路径和编译选项,配置好之后,运行./configure, cmake -B xxx -S xxx .来生成makefile文件
编译,执行make命令后,会读取makefile文件,根据其中的规则执行编译任务,比如可以调用gcc将源代码编译成可执行二进制文件。
安装,执行make install命令,编译好的二进制文件被复制到系统的指定位置(这个位置写在makefile中的),通是/usr/local/bin、/usr/local/lib
卸载,执行make uninstall命令,按照预定义的规则将安装的文件删除。
通过make安装的软件,
不会自动检测依赖,必须保证所有的依赖库已经正确安装
升级复杂,无法处理残留文件和依赖关系
文件分散,难以追踪 ...
effective_cplusplus
条款29
函数要达到异常安全,需要满足两个条件:
不泄露资源
不允许数据败坏(至少需要数据是有效的)
异常安全函数通常可以达到如下几个等级
基本承诺,异常被抛出,程序的任何事物仍然是有效地(比如计数器失效,有序数组失序),但当前程序的现实状态不确定,可能是几种状态之一。
强烈保证,只有未执行和执行两种状态,失败则会返回到未执行状态。
不抛掷保证,承诺不抛出异常,内置类型的所有操作都提供不抛掷保证,所以无法捕获到这些异常,如:
12345678910111213 try{ int a = 0; int b = 5; int c = b / a; } catch(exception e){ cout << "ztj: " << e.what(); } return 0;}没有捕获到异常:(yolo) tangjie.zhang@moveai415:effective_cpp$ ./bFloatin ...