1. map中[]跟inserC++)
下标[]方法:若插入元素的键值存在于map中,则更新map对应的value值。若不存在,则创建键值为插入元素的键值的元素,再将插入元素的值赋值给新建元素的值。
insert()方法:若插入元素的键值存在于map中,则插入失败。若不存在,直接将新元素加入到map中。
2. 如何避免头文件重复包含(C++)
头文件重复包含会出现问题:符号(函数、变量、类等)的重定义。
解决办法:
1.
#ifndef _HEADERNAME_H
#define _HEADERNAME_H
//头文件内容
#endif
通过宏定义,当头文件再次被包含,通过条件编译从而忽略内容,但仍然将整个头文件读入,降低编译速度。可移植性高。
2. #pragma once
区别与宏定义处理,该方法不会重复打开相同头文件,编译速度更快。
3. 拥塞控制和流量控制区别(计算机网络)
流量控制解决的是发送方和接收方速率不匹配的问题。
拥塞控制解决的是避免网络资源被耗尽的问题。
4. TCP流量控制(计算机网络)
流量控制:防止发送方与接收方速率不匹配,可能导致数据丢失。
实现原理:
1. 发送方解析接收方的响应数据包,根据接收方的接收窗口大小调整自己的发送窗口大小,发送窗口内的数据。
2. 发送方通过向前滑动发送窗口的方式移除已确认被正确接收的数据,并将他们从缓存区删除。
5. TCP的TIME_WAIT状态为什么要等待2MSL的时长(计算机网络)
MSL,Maximum Segment Lifetime,最大报文段生存时间。即任何TCP报文在网络中存在的最大时长,如果超过这个时间,这个TCP报文就会被丢弃。
因为客户端不知道服务端是否能收到ACK应答数据包,服务端如果没有收到ACK,会进行重传FIN,考虑最坏的一种情况:第四次挥手的ACK包的最大生存时长(MSL)+服务端重传的FIN包的最大生存时长(MSL)=2MSL
6. 内存管理(C++)
分配方式:
1. 栈:分配给函数局部变量等数据,函数结束时自动释放。由于内置处理器指令集中,效率高,但内存容量有限。
2. 堆:malloc分配内存,由程序员手动free。
3. 自由存储区:用new分配内存,由程序员手动delete。
4. 全局/静态存储区:分配给全局变量和静态变量。
5. 常量存储区:分配给常量。
7. 堆和栈的区别(C++)
区别:
1、管理方式不同:栈是由编译器自动管理,无需我们手工控制;堆释放工作由程序员控制。
2、空间大小不同:默认的栈空间大小是1M,在32位系统下,堆内存可以达到4G的空间,
3、能否产生碎片不同:栈不会产生碎片,堆会产生碎片。
4、生长方向不同:堆生长方向是向上的,向着内存地址增加的方向;栈的生长方向是向下的,向着内存地址减小的方向增长。
5、分配方式不同:栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配、动态分配由alloca函数进行分配。堆都是动态分配。
6、分配效率不同:栈效率高,堆效率低。
8. vector迭代器什么时候会失效?(C++)
1. push_back导致迭代器失效 :扩容重新申请内存,导致原本的迭代器失效。
2. insert导致迭代器失效:扩容重新申请内存,导致原本的迭代器失效。
3. 删除操作导致迭代器失效:原本迭代器地址改变或删除。
9. inliine函数可以虚函数码?(C++)
inline函数没有地址,无法将他存放到虚函数表中。
10. 静态成员可以是虚函数吗?(C++)
静态成员函数中没有this指针,无法放进虚函数表里面。
11. 联合体、结构体、类的区别(C++)
1. 结构体:一种数据结构,一些元素的集合。
2. 联合体:使用覆盖技术,几个变量互相覆盖。
3. 类:结构体升级版,含有数据成员和方法。
类与结构体区别:
1. 结构体不存在任何函数,包括构造函数和析构函数,而且是一个公共的类。
2. 结构体默认成员是public,类默认成员是private。
3. 结构体继承默认public,类继承默认private。
联合体和结构体的区别:
1. 占用内存大小不同:结构体里每个数据类型都有独立地址空间,通过内存对齐的方式,占有空间大小,联合体所有数据类型共同占用最大数据类型的地址空间。
2. 同一时刻,结构体所有成员都存在,联合体只存在一个成员。
12. extern “C” (C/C++)
实现C和C++混合编程。由于 C++ 和 C 在程序的编译、链接等方面都存在一定的差异,而这些差异往往会导致程序运行失败。
13. 指针和数组的区别(C/C++)
数组:数组是用于储存多个相同类型数据的集合。
指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。
区别:
1. 赋值:同类型指针变量可以相互赋值,数组只能一个一个元素赋值。
2. 存储:指针就是一个变量,数组在内存中是连续存放,通过数组下标进行访问。
14. 构造和析构函数调用顺序 (C/C++)
构造函数的调用顺序 :
基类构造函数、对象成员构造函数、派生类本身的构造函数 。
派生类本身的析构函数、对象成员析构函数、基类析构函数(与构造顺序正好相反) 。
15. DFS和BFS