烤面筋的第四场

在这里插入图片描述

本次烤面筋,基于昨晚被虐的基础上,补缺补漏。
昨晚已经总结好了,不过我设置了本人可见,有些内容比较私密。


Question One:纯虚函数和虚函数的区别

1、定义方式的不同。

纯虚函数:virtual void func() = 0;
虚函数:virtual void func();

2、含有纯虚函数的类称为抽象类,如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。

3、虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。

4、在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。


接下来继续把基础相关的过一下,操作系统之类的后面有安排,循序渐进嘛。


Question Two:请你来说一下map和set有什么区别,分别又是怎么实现的?

(1)map中的元素是key-value(关键字—值)对;Set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字。

(2)set的迭代器是const的,不允许修改元素的值;map允许修改value,但不允许修改key。
map和set是根据关键字排序来保证其有序性的,如果允许修改key的话,那么首先需要删除该键,然后调节平衡,再插入修改后的键值,调节平衡,如此一来,严重破坏了map和set的结构,导致iterator失效。

(3)map支持下标操作,set不支持下标操作。

set 底层是通过红黑树(RB-tree)来实现的。又由于 set 所开放的各种操作接口,RB-tree 也都提供了,所以几乎所有的 set 操作行为,都只有转调用 RB-tree 的操作行为而已。
map也是如此。


Question Three:请你来说一说STL迭代器删除元素

这个问题啊,其实已经说过很多遍了,在C++里面说过,在Python里面也说过。
1.对于序列容器vector,deque来说,使用erase(itertor)后,会出现各种各样的问题,比方说出现野指针、foreach中删除啊等的,反正这样写就好:

vector<int>::iterator itor2;

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
    
    
     if( *iter == 3)
     {
    
       
          itor2=iter;
          veci.erase(itor2);
     }
     else
          iter ++ ;
}

2.对于关联容器map set来说,使用了erase(iterator)后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素的,不会影响到下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。

3.对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的iterator,因此上面两种正确的方法都可以使用


Question Four:请你来说一下STL中迭代器的作用,有指针为何还要迭代器

Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->、*、++、–等。

迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用*取值后的值而不能直接输出其自身。


Question Five: 请你来说一下C++中struct和class的区别

这我倒是没有关注过。

class可以定义模板类形参,比如template <class T, int i>。


结构体(sturct)是一种值类型,而类(class)是引用类型。区别在于复制方式,值类型的数据是值赋值,引用类型的数据是引用复制。
结构体使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)。
栈的空间相对较小.但是存储在栈中的数据访问效率相对较高;堆的空间相对较大.但是存储在堆中的数据的访问效率相对较低
结构体使用完之后就自动解除内存分配,类实例有垃圾回收机制来保证内存的回收处理 。

如何选择结构体还是类
1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2. 结构体表示如点、矩形和颜色这样的轻量对象。
3. 在表现抽象和多级别的对象层次时,类是最好的选择,因为结构体不支持继承
4. 大多数情况下该类型只是一些数据时,结构体时最佳的选择


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43762191/article/details/114335667