目录
1.迭代器的原理
迭代器是一种设计模式,在C++中迭代器是一种对象,他的行为类似于指针,用于遍历容器中的元素。迭代器提供了统一的接口,使得我们在遍历不同的容器时可以使用相同的方法。每个容器类都会有一个迭代器类,每个容器类还会提供一些成员函数来创建迭代器,例如begin、end函数。对于迭代器的操作,底层会使用operator对*、++、--、==、!=这些操作符进行重载,那么这样的话,即使不了容器的底层实现,在上层也可以用使用统一的方式进行操作迭代器了。
2.迭代器失效问题
- vector的插入和删除操作,如果导致了扩容内存重新分配的话,就会导致元素的存储位置发生改变,从而导致迭代器失效,如果没有导致扩容,那么在插入节点以及之后的所有元素位置的迭代器也会失效,因为所有元素都向后移动了,对于删除元素也是同理。
- deque的插入和删除操作,如果是对于两端的插入和删除,那么不会有问题,对于中间的插入和删除会导致所有的迭代器失效。
- 对于list、forward_list以及map、set等关联式容器的删除操作:只会对删除节点的迭代器产生失效。
3.vector的内存管理
vector的默认构造函数通常不会立即申请内存空间,而是等到有元素插入的时候才会去申请空间,申请的空间一般会比现有的元素大很多,防止频繁的扩容导致性能的降低。对于扩容机制,会根据不同的编译器和标准库实现而有差异。
当然也可以手动的去管理内存:resize和reserve函数就可以预先申请一部分空间,当我们知道自己要用多大的空间时,可以直接一次申请n个大小的空间,防止多次扩容了。对于释放内存,clear函数只是释放了元素,而并非将内存还给操作系统,可以使用shrink_to_fit函数将vector的容量调整为与元素数量相同,也就是释放多余的内存空间。
4.vim的命令模式指令集合
移动光标:
指令 | 说明 | 指令 | 说明 |
gg | 光标移动到文本开头 | G | 光标移动到文本结尾 |
n + G | 光标移动到文本第n行 | $ | 光标移动到行的末尾 |
^ | 光标移动到行的开头 | hjkl | 上下左右移动 |
w | 下一个单词的开头 | b | 上一个单词开头 |
复制与撤销:
指令 | 说明 | 指令 | 说明 |
yy | 复制当前行到缓冲区 | p | 将缓冲区的数据粘贴到光标位置 |
n + yy | 复制n行 | n + p | 复制n次 |
yw | 复制从光标开始到子字符串末尾处 | n + yw | 复制n个字符 |
u | 撤销操作 | ctrl + r | 恢复撤销操作 |
删除与剪切:
指令 | 说明 | 指令 | 说明 |
dd | 剪切当前行 | n + dd | 剪切n行 |
小写x | 删除光标位置的字符 | n + x | 删除n个光标位置的字符 |
大写X | 删光标位置前的字符 | n + X | 删除光标位置前的n个字符 |
替换:
指令 | 说明 | 指令 | 说明 |
~ | 大小写转换 | r | 替换光标位置字符 |
n + r | 连续替换多个字符为一个字符 | R | 替换贯标所到之处的所有字符,相当于切换为了替换模式 |
5.进程与线程的区别
(系统开销、调度、独立性、通信、健壮性)
- 进程是资源分配大的基本单位,而线程是进程内部的一个执行流,是CPU调度的基本单位。
- 在执行和调度方面,线程的调度切换开销比较小,主要涉及切换进程上下文等数据,不需要切换进程地址空间。
- 并发性方面,进程具有独立性,所以说不需要额外的控制,而线程是共用一个地址空间,所以对于公共资源的一个访问需要进行采用互斥同步等机制保证数据的一致性问题。
- 系统开销上,创建进程需要创建进程PCB,创建地址空间、创建页表,加载程序代码和数据并建立页表映射,创建文件描述符表等等操作,销毁的时候也需要将这些内容都销毁。而创建线程的话,就只需要创建一个线程PCB,并在共享区申请一块栈区空间即可,比较轻量化。
- 多进程之间的通信需要通过操作系统辅助来完成,通过管道、IPC通信进行完成,而线程天然的就可以看到同一块资源,所以可以随时通信。
- 线程的优点在于轻量化、可以充分利用CPU多核资源,对于密集计算或密集I/O操作可以更好的处理。缺点在于缺乏访问控制,健壮性很差。
6.多线程的最大问题
- 多线程并发访问导致的数据不一致的问题,需要加锁来实现,但是加锁的话会影响效率,所以多线程下的最大问题在于如何保证数据一致,而且减少锁的使用。
- 上下文切换的开销,尽管说线程的调度切换开销小,但是如果线程数量过多的话,也会对系统产生明显的效率影响。
7.HTTP协议与HTPPS协议区别
http协议是超文本传输协议,只负责构建需要传输的数据。https协议是超文本传输安全协议,是在http协议基础之上加上了SSL/TLS加密协议层,它位于应用层和传输层协议之间。采用CA认证和非对称加密相结合的方式进行密钥的协商工作,后续采用对称加密的方式传输数据。
在身份认证方面,https协议需要服务器向客户端提供数字证书来表明自己的身份才可以,防止了中间人篡改公钥。该证书是由权威机构进行颁发的,其中包含服务端的公钥、服务器名称以及证书的有效期等内容。
在端口方面:http一般使用80号端口,https一般使用443号端口。
效率方面:对于连接建立HTTP非常简单,只需要TCP三次握手之后就可以传输了,而HTTPS则需要在三次握手之后,进行SSL/TLS握手来协商加密算法以及密钥交换等操作。在数据传输时还需要对进行数据的加密和解密操作,而HTTP协议是明文传输。所以说效率方面HTTP协议基本上是全面超过HTTPS,但是出于安全的考虑,还是基本上会使用HTTPS协议进行传输的。