2022暑期复习-Day7

本文探讨了迭代器失效的概念,指出vector的插入和删除操作可能导致迭代器失效,并解释了基类成员访问规则。此外,深入解析了公有派生中派生类与基类的关系,重点讲解了虚函数的应用。编程题展示了如何在类设计中实现代码重用和虚函数的使用。
摘要由CSDN通过智能技术生成

选择题

Q1 下面关于迭代器失效的描述哪个是错误的( )。

A: vector的插入操作不会导致迭代器失效
B: map的插入操作不会导致迭代器失效
C: vector的删除操作只会导致指向被删除元素及后面的迭代器失效
D: map的删除操作只会导致指向被删除元素的迭代器失效

关于迭代器失效的意义

  • 野指针:访问越界了
  • 指向的意义改变了:迭代器不再指向希望指向的元素

对于顺序结构的容器而言,这个是非常容易出现上述两个问题的。

vector的插入操作会导致,
两种情况:

  1. 插入点后面的元素都会往后移动,指向的意义发生了改变
  2. 因为插入了元素,导致超出当前的最大容量,那么扩容就可能会导致整个开辟一个新的空间,将原来的元素拷贝到新的空间,且析构原空间。造成野指针

vector的删除操作,会导致删除点后的元素都往前移动,那么删除点后元素的迭代器的意义都发生了改变。

对于底层结构是一颗链式结构的红黑树的容器map,删除元素只会导致当前元素的迭代器失效。
插入操作不会导致迭代器失效,对原有迭代器没有影响

答案:A

Q2 派生类对象可以在类外访问基类成员中的( )。

A: 公有继承的私有成员
B: 私有继承的公有成员
C: 公有继承的保护成员
D: 以上都错

参考继承关系和访问限定符

想要派生类外访问类内的成员成员,那么就只有是派生类的public成员,那么就只有,基类的public成员,且派生类public继承

答案:D

Q3 在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是( )。

A: 派生类的对象可以赋给基类的对象
B: 派生类的对象可以初始化基类的引用
C: 派生类的对象可以直接访问基类中的成员
D: 派生类的对象的地址可以赋给指向基类的指针

这里主要涉及继承和多态的知识点,不了解可以参考多态杂谈继承杂谈

派生类可以被基类的指针和引用访问。

派生类是访问自己继承的基类的成员的,因为是继承机制,但是不能访问基类对象的成员,因为会越界。

基类的私有成员在派生类种是不可见的,无法访问。参考Q2

答案:C

Q4 、有这样一个类:

在这里插入图片描述
现在希望定义一个Head类,也想实现Look的功能,应该使用( )方法,实现代码重用。
A: 继承
B: 组合
C: 模板
D: 过滤

Head类可以继承这个Eye类,然后通过重定义/隐藏的方式实现这个Look功能,如果这是一个虚函数就能通过重写方式。

模板确实也算为了实现代码重用的机制,但是这是泛型编程中的思想,类名都是一样的,这里这明显用不了这个机制。

组合,我觉得或者和聚合应该是一个意思,是在一个类中创建另一个类的对象,然后通过调用指定接口的方式来实现代码重用

这个过滤是一种设计模型,这个是用多标准来同意一个标准,我认为主要并不是为了实现代码重用

答案:AB

Q5 下列哪种函数可以定义为虚函数( )。

A: 构造函数
B: 析构函数
C: 内联成员函数
D: 静态成员函数

虚函数是指函数能在继承关系中重写的一种函数,有virtual前缀
不过有一些特殊的情况,这是由于编译器的原因。
在这里插入图片描述
析构函数定义为虚函数时:基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放

答案:B

编程题

比较简单

Q6

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
        vector<vector<int>> ret;
        if(original.size()!=m*n)
        {
            return ret;
        }
        int a = 0;
        for(int i = 0;i<m;i++)
        {
            vector<int> v;
            for(int j = 0;j<n;j++)
            {
                v.push_back(original[a]);
                a++;
            }
            ret.push_back(v);
        }
        return ret;
    }
};

Q7

在这里插入图片描述

class Solution {
public:
    vector<string> buildArray(vector<int>& target, int n) {
        vector<string> ret;
        int a = 0;
        for(int i=1;i<=n;i++)
        {
            if(a<target.size())
            { 
                if(target[a]==i)
                {
                    ret.push_back("Push");
                    a++;
                }
                else if(target[a]!=i)
                {
                    ret.push_back("Push");
                    ret.push_back("Pop");
                }
            }
        }
        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值