[关闭]
@markheng 2018-10-13T15:36:03.000000Z 字数 19558 阅读 1567

C++后台开发 2019秋招知识准备

找工作


右边(上角)有目录。

一些题目


C++语言基础

C++11新特性

多线程

lambda

  1. [closure](parameters)->return_value{statements;}

重载postfix ++ 和 prefix++

  1. template <typename T>
  2. const T operator++(int){
  3. ...
  4. }

返回const T 防止 T t; t++++;的用法
- prefix

  1. template <typaname T>
  2. T& operator++(){
  3. ...
  4. }

参数只是用来区分前置后置

关键字 explicit extern const static volatile export

const修饰成员函数
1.const修饰类的成员函数,则该成员函数不能调用类中任何非const成员函数
2.const成员函数能够访问对象的const成员,而其他成员函数不可以。
new返回的指针必须是const类型的

new/delete malloc/free new[]/delete[] placement new

new 、operator new 和 placement new 区别
(1)new :不能被重载,其行为总是一致的。它先调用operator new分配内存,然后调用构造函数初始化那段内存。
new 操作符的执行过程:
1. 调用operator new分配内存 ;
2. 调用构造函数生成类对象;
3. 返回相应指针。
(2)operator new:要实现不同的内存分配行为,应该重载operator new,而不是new。
operator new就像operator + 一样,是可以重载的。如果类中没有重载operator new,那么调用的就是全局的::operator new来完成堆的分配。同理,operator new[]、operator delete、operator delete[]也是可以重载的。
(3)placement new:只是operator new重载的一个版本。它并不分配内存,只是返回指向已经分配好的某段内存的一个指针。因此不能删除它,但需要调用对象的析构函数。

多态与虚函数表

覆盖与隐藏
基类函数没有virtual关键字时,只要子类中含有与该函数名称相同的函数,基类函数就会被隐藏。隐藏本质上是C++在命名空间内的查找顺序,先查找子类空间,因此父类的函数好像被隐藏了。
如果有virtual关键词,且子类函数名和参数与基类完全相同,才叫做覆盖。
编译时多态:通过重载函数实现;运行时多态:通过虚函数实现
纯虚函数表明基类没有实现,需要子类去实现自己的方法
含有纯虚函数的类为抽象类,抽象类的存在是为了规范类的行为,提高编码效率
动态绑定的实现
只有采用“指针->函数()”或“引用变量.函数()”的方式调用C++类中的虚函数才会执行动态绑定
虚函数表
每个类会持有一个自己的虚函数表,存在全局数据区(C++中内存分为栈、堆、代码区、全局数据区和文字常量区),虚函数表中记录了父类和自己的函数位置,父类虚函数在前,子类虚函数在后,如果子类覆盖了父类的虚函数,那么父类虚函数的位置会被直接用子类的虚函数位置替代,不管是单继承还是多继承。

C++的四种类型转换

内存与STL

常用C库函数实现

STL常用结构的实现

  1. vector 底层数据结构为数组 ,支持快速随机访问
  2. list 底层数据结构为双向链表,支持快速增删
  3. deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问
    deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下:
    [堆1] --> [堆2] -->[堆3] --> ...
    每个堆保存好几个元素,然后堆和堆之间有指针指向,看起来像是list和vector的结合品.
  4. *stack 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
  5. *queue 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
    (stack和queue其实是适配器,而不叫容器,因为是对容器的再封装)
  6. priority_queue 的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现
  7. set 底层数据结构为红黑树,有序,不重复
  8. multiset 底层数据结构为红黑树,有序,可重复
  9. map 底层数据结构为红黑树,有序,不重复
  10. multimap 底层数据结构为红黑树,有序,可重复
  11. hash_set 底层数据结构为hash表,无序,不重复
  12. hash_multiset 底层数据结构为hash表,无序,可重复
  13. hash_map 底层数据结构为hash表,无序,不重复
  14. hash_multimap 底层数据结构为hash表,无序,可重复

STL的重要机制

STL源码剖析笔记 - STL的Allocator
STL源码剖析笔记 - traits编程技法

Linux和网络

同步异步、阻塞非阻塞

用户权限划分

进程线程协程

https://www.jianshu.com/p/f11724034d50

互斥锁、条件变量和信号量

IPC(进程间通信)

  1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
  2. 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
  3. 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  4. 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  5. 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  6. 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
  7. 信号 ( signal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

网络协议

网络通信

五中IO模式

socket通信与IO多路复用*

poll、epoll、select

  1. int epoll_create(int size);
  2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
  3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

序列化

内存管理

硬链接和软连接区别

https://blog.csdn.net/carry1314lele/article/details/2649572
软连接存储了被连接文件的目录,相当于指针;硬链接指向被连接文件的地址,相当于别名。

kill不起作用的情况

linux常用命令

LRU算法 LFU FIFO

LRU最近最久未使用

  1. //list 实现 https://www.cnblogs.com/dolphin0520/p/3741519.html
  2. // map<int, list<int>::iterator> 存储key到list指针的映射,方便使用find方法
  3. // 也可以在Node{int k, value;}中实现operator==,然后用std::find()进行查找

LFU最近最少使用

TCP三次握手与四次挥手以及为什么是三次和四次

https://www.jianshu.com/p/ef892323e68f

三次握手:

  1. client --------------------------- server
  2. | |
  3. SYN_SEND | -----------SYN------------> | SYN_RCVD
  4. ESTB | <=========-SYN &ACK======== |
  5. | -----------ACK------------> | ESTB

三次握手分别是 SYN, SYN&ACK, s

四次挥手

  1. client --------------------------- server
  2. | |
  3. FIN_WAIT1 | -----------FIN------------> | CLOSE_WAIT
  4. FIN_WAIT2 | <==========ACK=========== |
  5. . ......... .
  6. | <========data ACKn======= |
  7. TIME_WAIT | <========FIN============= | LAST_ACK
  8. (2MSL) | -----------ACK------------> | CLOSE

TIME_WAIT也叫2MSL等待状态
四次挥手分别是 client FIN, ACK, server FIN, ACK

三次握手原因:server端的syn和ack作为一个包发送,所以是三次握手。
而断开连接时,server对fin确认之后,通常还会发送一些数据,因此server端的fin和ack是分开发送的,因此是四次。

TCP端口扫描

TCP拥塞控制*

TCP 协议如何保证可靠传输

重传和确认

慢开始和快重传

HTTP协议

https://yq.aliyun.com/articles/609071

HTTP工作流程

HTTP常用方法

常见的Http协议状态

Http协议有哪些特征?

HTTP1.0与1.1,2.0的区别

1.0需要每个链接都建立TCP链接,1.1不需要

HTTP的缺点

Cookie和Session的区别

HTTP 是一种无状态的连接,客户端每次读取 web页面时,服务器都会认为这是一次新的会话。但有时候我们又需要持久保持某些信息,比如登录时的用户名、密码,用户上一次连接时的信息等。这些信息就由 Cookie 和 Session 保存。

HTTPS 与 HTTP 的区别

数据库

数据库范式

第一范式

列不可分

第二范式

非主属性完全依赖于主属性,不能只依赖主属性的一部分,如果有依赖主属性一部分的情况,那么应当将多余的部分重新组成新的实体,防止冗余

第三范式

非主属性不能包含其他实体中非主属性已经出现的属性,避免冗余

BCNF

主属性中的一部分依赖于主属性的另一部分,应当避免

ACID特性

数据库隔离级别

MYSQL的两种存储引擎区别

https://www.cnblogs.com/wangdake-qq/p/7358322.html

并发控制

SQL优化(从sql语句优化和索引两个部分回答)

B+索引与哈希索引的区别

https://www.cnblogs.com/heiming/p/5865101.html

B树,B+树,B*树

主键原理

聚集索引的区别

索引失效的情况

内连接、外连接、交叉连接、笛卡儿积

MVCC机制(多版本并发控制)及其场景

实例 https://blog.csdn.net/whoamiyang/article/details/51901888

解决死锁方法

数据结构

哈希表

数组:队列、优先队列、栈

字符串

链表

树的增删改查

算法

DFS、BFS:最短路径

生成树算法

最短路径算法

排序

插入排序

冒泡排序

选择排序

快速排序

希尔排序

堆排序

计数排序

桶排序

基数排序

三色旗问题

https://blog.csdn.net/puqutogether/article/details/41805083

二分

二分查找问题汇总

二分查找的三种形式

https://www.cnblogs.com/upcwanghaibo/p/6628240.html

  1. // 1.闭区间
  2. // 取值的范围是[left,right],一定要保证每次循环结束后left+1或者right-1,结束的状态left>right,left在右边,right在左边,目标值下标确定是left。
  3. int binarySearch(vector<int>& nums, int target){
  4. if(nums.size() == 0)
  5. return -1;
  6. int left = 0, right = nums.size() - 1;
  7. while(left <= right){
  8. // Prevent (left + right) overflow
  9. int mid = left + (right - left) / 2;
  10. if(nums[mid] == target){ return mid; }
  11. else if(nums[mid] < target) { left = mid + 1; }
  12. else { right = mid - 1; }
  13. }
  14. // End Condition: left > right
  15. return -1;
  16. }
  17. //2 开区间
  18. // 取值范围是[left,right),right无法得到,它有两种形式left+1<right和left<right.
  19. // 当是left+1<right这种形式时,left和right都不需要加一或者减一,结束状态是left<right,无法确定最后的目标值下标是left还是right,最后还需要做一次判断。
  20. int binarySearch(vector<int>& nums, int target){
  21. if(nums.size() == 0)
  22. return -1;
  23. int left = 0, right = nums.size();
  24. while(left < right){
  25. // Prevent (left + right) overflow
  26. int mid = left + (right - left) / 2;
  27. if(nums[mid] == target){ return mid; }
  28. else if(nums[mid] < target) { left = mid + 1; }
  29. else { right = mid; }
  30. }
  31. // Post-processing:
  32. // End Condition: left == right
  33. if(left != nums.size() && nums[left] == target) return left;
  34. return -1;
  35. }
  36. //3
  37. int binarySearch(vector<int>& nums, int target){
  38. if (nums.size() == 0)
  39. return -1;
  40. int left = 0, right = nums.size() - 1;
  41. while (left + 1 < right){
  42. // Prevent (left + right) overflow
  43. int mid = left + (right - left) / 2;
  44. if (nums[mid] == target) {
  45. return mid;
  46. } else if (nums[mid] < target) {
  47. left = mid;
  48. } else {
  49. right = mid;
  50. }
  51. }
  52. // Post-processing:
  53. // End Condition: left + 1 == right
  54. if(nums[left] == target) return left;
  55. if(nums[right] == target) return right;
  56. return -1;
  57. }

回溯:八皇后

动态规划

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注