C++ 面试总结

一、STL 之 vector
1、底层是一个可以存储任意类型的动态数组;可以随机访问元素
2、vector扩大容量的本质:当vector的大小和容量相同,也就是满载时,需要再添加元素,vector就需要扩容,主要经历以下3步:完全弃用现有的内存空间,重新申请更大的内容空间;将旧内存空间中的数据,按原有顺序移动到新的内存空间中 ;最后将旧的内存空间释放。工程浩大
3、删除操作会使iterator失效:vector在遍历中进行erase,此时iter++会出现bug,产生野指针和coredump;解决办法:要删除的时直接赋值返回值,不能++;
 
二、STL 之 list
1、底层是双向的环状链表,有效的利用空间;
2、插入和连接操作不会造成原来list的迭代器失效;
3、erase操作仅仅使得“指向被删除元素”的迭代器失效,其他迭代器不受影响;双向迭代器
4、排序操作是归并排序
 
三、STL 之 map、set
1、底层是红黑树:非标准的平衡二叉树
2、红黑树和平衡二叉树的:标准的平衡二叉树叶子节点间的最大深度不能超过1,但红黑树,以牺牲部分的平衡性换取操作上旋转次数的降低,插入操作旋转次数不超过2,删除不超过3,
3、满足的规则:
                        1、节点是红色或黑色
                        2、根是黑色
                        3、所有叶子都是黑色(叶子是 NULL 节点)
                        4、每一个红色节点必须有两个黑色的子节点(不能连续红)
                        5、从任一节点到每个叶子的所有简单路径都包含相同数目的黑色节点。(维持一种黑色平衡),这点证明了它并非是平衡二叉搜索树。
5、1*该路径上的黑色节点数量 <= 任意路径长度 <= 2 * 该路径上的黑色节点数目(红色节点和黑色节点一样多)
 
从上述特点得知:
新增节点必须为红
新增节点之父节点必须为黑。
 
四、STL 之 智能指针
1、shared_ptr——共享所有权,所有引用指针指向一个对象。内部采用计数器确定对象被引用的次数,引用一次计数器增加1,堆上分配,取消引用计数器减1,当计数器减到0,删除该对象。最大的缺点就是不能管理循环引用的对象,会因两者都无法释放导致内存泄露,解决此类问题的方式有:当只剩下最后一个引用时手动打破循环引用释放对象;使用weak_ptr打破循环引用。
shared_ptr默认下是不能指向数组的,因为它默认的删除器是delete对智能指针中的对象进行删除,而delete要求new是单一指针,如果要指向new[]申请的动态内存,则需要为智能指针定义一个删除器。
2、weak_ptr——为了配合shared_ptr引入的智能指针,不具备普通指针的行为,只能对shared_ptr进行引用,而不改变引用计数,虽然功能较弱,但它可以打破shared_ptr会存在的循环引用,它可以用lock()方法判断管理的资源是否被释放。
3、unique_ptr——用来替代auto_ptr的,更安全。独占型的智能指针,即两个unique_ptr不能指向同一个对象,它无法复制其他unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何STL算法。不能拷贝只能够移动unique_ptr,即对资源管理权限可以实现转移,旧的unique_ptr不再拥有此资源。当程序不需要多个指向同一个对象的指针,则可以使用unique_ptr,另外unique_ptr可以指向new和new[]申请的动态内存
4、auto_ptr——因安全问题已弃用。因为auto_ptr也是独占性,但它可以通过复制构造函数(浅拷贝),拷贝原对象变得无效后,再次访问源对象会导致程序崩溃
 
五、Linux常用命令之权限控制
1、访问权限:
  • 读取r
  • 写入w
  • 可执行x
2、用数字表示权限,规定数字4、2、1表示读、写、执行权限。如可读行rwx,权限位设置为4+2+1=7;
常用权限有
-rw------- (600)    只有拥有者有读写权限。
-rw-r--r-- (644)    只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700)    只有拥有者有读、写、执行权限。
-rwxr-xr-x (755)    拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711)    拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666)    所有用户都有文件读、写权限。
-rwxrwxrwx (777)    所有用户都有读、写、执行权限。
3、归属:属主;属组
4、权限管理命令:chmod,只有文件所有者和root才可以更改文件的权限; 
        chmod [options] mode files,chomd u+rw a.conf 给file的属主增加可写及执行权限
5、设置文件和目录的归属命令:chown
 

六、C++移动构造函数与拷贝构造函数

1、拷贝构造函数:为新对象复制一份和其他对象一模一样的数据,当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝的方式复制该指针成员。这是左值。

2、移动构造函数:指的就是移动而非深拷贝的方式初始化含有指针成员的类对象,将其他对象拥有的内存资源“移为己有”,与其他构造函数不同,他使用的是右值引用形式的参数。

指针的浅层复制是非常危险。之所以危险,是因为两个指针共同指向一片内存空间,若第一个指针将其释放,另一个指针的指向就不合法了。所以我们只要避免第一个指针释放空间就可以了。避免的方法就是将第一个指针(比如a->value)置为NULL,这样在调用析构函数的时候,由于有判断是否为NULL的语句,所以析构a的时候并不会回收a->value指向的空间(同时也是b->value指向的空间)

七、左值和右值

1、左值:可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,可以改变值的量。是有存储空间的对象,即左值代表的是一个内存的地址值,可以寻址可以读写,相当于是地址值

2、右值:数据值

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值