C++面试宝典(纯干货)

格桑2021-12-22 14:08

  本文列出了C++面试中经常遇到的一些问题,这些问题常见的面试考点。如果以后遇到其他常见的面试问题,会再次更新。希望对最近参加面试的同学有所帮助。顺序与问题的重要性无关。查的时候最好全面了解一下。

C++面试题

  一、C++标准库的map和set有什么区别?

  map和set都是C++的相关容器,底层是红黑树。

  map和set的区别在于:

  map中的元素是key-value(键-值)对:关键字起索引作用,值表示和索引。

  相关数据;set是关键字的简单集合,set中的元素只包含一个关键字。

  set迭代器为const,不允许修改元素值;map允许修改value,但不允许修改key。

  原因是map和set是根据关键字排序来保证它们的有序性的。如果允许修改关键字,先删除键,然后调整树平衡,再插入修改后的键值,再重新调整树平衡。这样会破坏map和set的结构,导致迭代器失效。

        map支持下标操作,set不支持下标操作。

  二、为什么map底层要用红黑树来实现?

  红黑树的特点:红黑树是二叉搜索树,但在每个节点中添加一个储存作为节点的颜色,可以是红色或黑色。通过限制任何从根到叶的路径上每个节点的着色方式,红黑树确保没有一条路径比其他路径长两倍。因此,它是一种弱平衡二叉树。与严格的平衡二叉树(AVL)相比,它的旋转次数较少,因此红黑树通常用于搜索、插入和删除更多。

  AVL是严格平衡的。频繁的插入和删除会导致频繁的再平衡,降低效率;红黑树平衡弱,是一种折中。插入最多旋转2次,删除最多旋转3次。因此,红黑树在搜索、插入和删除中的复杂性是O(logn),性能稳定。因此,包括map底层在内的许多STL结构都是红黑树。

  三、简述weak_ptr的作用。

  weak_ptr是为了配合shared_ptr而引入的智能指针,因为没有重载operator*和->,所以不能像普通指针那样使用。

  weak_ptr最大的作用是帮助shared_ptr工作,像旁观者一样观察资源的使用情况。weak_ptr可以从一个shared_ptr或另一个weak_ptr对象中获得资源观测权。但是weak_ptr没有共享资源,其结构不会增加shared_ptr引用计数。

  使用weak_ptr的成员函数use_count()可以观察资源的引用计数,另一个成员函数expired()的功能等于use_count()==0.表示观察到的资源再存在。weak_ptr还可以使用成员函数lock()从观测到的shared_ptr中获得可用的shared_ptr对象,从而操作资源。但当expired()==true时,lock()函数将返回存储空指针的shared_ptr。

  简而言之,就是:

  观察shared_ptr资源的使用情况。

  解除shared_ptr循环引用问题

  四、为什么C/C++参数入栈顺序从右向左?

  从右向左压栈的顺序与C/C++支持可变参数有关。C/C++要求在声明参数可变函数时至少有一个确定的参数。为什么?因为需要一个参数来为函数提供可变参数的类型(否则函数如何知道如何分析后续的可变参数?例如,可变参数列表中有两个参数,一个是int型,另一个是byte型。当函数分析可变参数表时,如何知道如何分析这五个字节的数据)如果提前确定一个可变参数的参数类型,这个参数就没有意义了。

  如果参数从左栈的顺序是从左到右压栈,第一个参数(即描述可变参数表各变量类型的参数)会放在栈底。由于可变参函数的第一步需要分析可变参数表的各种参数类型,即第一步需要获得上述参数,因此放在栈底非常不方便。当然,可变参功能也可以从左到右压栈,但在这种情况下,实现这个功能会更加复杂。

  以上就是小编为大家整理发布的“C++面试宝典(纯干货)”一文,更多相关内容尽在开课吧广场C++教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享