stl中红黑树和散列表的实现、应用和技巧
stl组成部分容器、算法、迭代器、仿函数(函数对象),比如比较器、适配器、空间适配器(内存分配器)
容器C++ 提供了多种标准容器。以下是 C++ 中常见的容器:Array:静态数组,大小固定。Vector:动态数组,支持随机访问和动态扩容。List:双向链表,支持插入和删除操作。Forward_list:单向链表,支持插入和删除操作。Deque:双端队列,支持在队首和队尾进行插入和删除操作。Stack:栈,支持基本的栈操作,先进后出。Queue:队列,支持基本的队列操作,先进先出。PriorityQueue:优先队列,支持按优先级插入和删除元素。Set:集合,不允许重复元素,元素按一定的排序规则存储。Map:映射,不允许重复的 key,元素按 key 的大小排序存储。Unordered_set:哈希表实现的集合,不允许重复元素。Unordered_map:哈希表实现的映射,不允许重复的 key。
迭代器的实现原理从上图中可以看出,STL通过类型别名的方式实现了对外统一;在不同的容器中类型别名的真实迭代器类型是不一样的,而且真实迭代器类型对于++、–、*、->等基本操作的实现方式
...
eoi prepare
职业评估参考资料官网:https://www.acs.org.au/资料下载:https://www.acs.org.au/msa/information-for-applicants.html帖子:https://www.oursteps.com.au/bbs/forum.php?mod=viewthread&tid=1551071pdf合并:https://www.ilovepdf.com/pdf压缩:https://www.ilovepdf.com/zh-cn/compress_pdfnaati: https://www.naati.com.au/、https://www.naati.com.au/online-directory/?require=translator&for=[607,757,1361]状态查询:https://www.acs.org.au/msa/secure/applicant-dashboard.html
1You will require 2 years relevant work experience completed within
...
redis/nginx/memcached等网络编程模型
对epoll以及reactor网络模型原理解析,并剖析redis、nginx、memcached等开源组件的网络模型,深刻理解其网络处理方式。
Unix Domain Socket
连接过程总的来说,基于 UDS 的连接过程比 inet 的 socket 连接过程要简单多了。客户端先创建一个自己用的 socket,然后调用 connect 来和服务器建立连接。
在 connect 的时候,会申请一个新 socket 给 server 端将来使用,和自己的 socket 建立好连接关系以后,就放到服务器正在监听的 socket 的接收队列中。 这个时候,服务器端通过 accept 就能获取到和客户端配好对的新 socket 了。
总的 UDS 的连接建立流程如下图。
我们找到 connect 函数的具体实现,unix_stream_connect。1234567891011121314151617181920212223242526//file: net/unix/af_unix.cstatic int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, int addr_len, int flags){ struct sockaddr_un *sunaddr
...
CPP易错点记录
拷贝构造函数和赋值运算符在默认情况下(用户没有定义,但是也没有显式的删除),编译器会自动的隐式生成一个拷贝构造函数和赋值运算符。但用户可以使用delete来指定不生成拷贝构造函数和赋值运算符,这样的对象就不能通过值传递,也不能进行赋值运算。拷贝构造函数必须以引用的方式传递参数。这是因为,在值传递的方式传递给一个函数的时候,会调用拷贝构造函数生成函数的实参。如果拷贝构造函数的参数仍然是以值的方式,就会无限循环的调用下去,直到函数的栈溢出。拷贝构造函数使用传入对象的值生成一个新的对象的实例,而赋值运算符是将对象的值复制给一个已经存在的实例。拷贝构造函数也是一种构造函数,那么它的功能就是创建一个新的对象实例;赋值运算符是执行某种运算,将一个对象的值复制给另一个对象(已经存在的)。调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符。
123456789101112131415161718192021222324252627282930313233343536373839404
...
C Plus学习笔记之二
基类与派生类的关系:
派生类对象可以使用基类的方法,条件是方法不是私有的。
基类指针可以在不进行显示类型转换的情况下指向派生类对象。
基类引用可以在不进行显示类型转换的情况下引用派生类对象。
C++有三种继承关系:公有继承、保护继承和私有继承。
公有继承是最常用的方式,它建立一种is-a关系,即派生类对象也是一个基类对象,可以对基类对象执行任何操作,也可以对派生类对象执行。注意:is-a关系通常是不可逆的,也就是说,水果不是香蕉。公有继承不能建立has-a、is-like-a、is-implemented-as-a、uses-a关系。
多态公有继承:在派生类中重新定义基类方法。使用虚方法virtual,该关键字只出现在方法原型中。对于虚函数,程序将根据对象类型来确定使用哪个版本。对于两个对象中行为相同的方法,只在基类中声明。如果没有使用关键字virtual,程序将根据引用类型或指针类型选择方法;如果使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法。方法在基类中声明为虚拟的后,它在派生类中将自动成为虚方法,一般也都在派生类中指出。为基类声明一个虚拟析构函数也是
...