STL中的list容器和map容器
1-1、list容器
底层结构:双向循环链表
![](https://i-blog.csdnimg.cn/blog_migrate/fc1bb4213741c56043f0cc1e3c2ce28b.png)
使用:
#include<list>
新增:
![](https://i-blog.csdnimg.cn/blog_migrate/83d01f8d86ec7bb27f7ae64aa778e001.png)
访问:
![](https://i-blog.csdnimg.cn/blog_migrate/741f01b6c38f889024c5e2918cfc8bd4.png)
删除:
![](https://i-blog.csdnimg.cn/blog_migrate/19e60e74d7b7de6b97d5d48d3f2ed6ba.png)
修改:
![](https://i-blog.csdnimg.cn/blog_migrate/8a731f2dcdcc05dc75891d041d91976b.png)
Splice:移动:
![](https://i-blog.csdnimg.cn/blog_migrate/4862f12959925046cdef81282c52a5f4.png)
1-2、map容器
底层结构: 二叉树 特点:查找速度很快
书写结构: 哈希表
Key ---value
Map的特点:会自动排序,按key值从小到大的顺序排序
Key-value的键值对 根据key可以快速的找到value值,他们是一一对应的关系
![](https://i-blog.csdnimg.cn/blog_migrate/b01bb52b0b487a0c85d52c506edf2761.png)
新增:
![](https://i-blog.csdnimg.cn/blog_migrate/37256eb4e1a32cd92a60332a4cb3beb4.png)
访问:
![](https://i-blog.csdnimg.cn/blog_migrate/ee795afd58facf6036972a47d6e5c39d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8fcccc8ffdae286edcdc01441d921243.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4b7182a963b4b8f9aba7f95d11dc7642.png)
删除以及修改:
![](https://i-blog.csdnimg.cn/blog_migrate/49ce049a05e250bc738cb1addcfa3706.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7948f51eb7a7ae6913f75090a9e7a927.png)
面试题目:
知道STL ?用过里面的什么容器?他们之间的区别是什么?vector、list、map的区别
回答的时候:
1、三个容器各自的结构
2、特点?
3、应用场景:?
继承
为什么要使用继承,解决什么问题?
减少代码冗余,新写的代码中可以直接使用已经有了的代码,提高开发效率!
qq版本更新:
其实就是在原有的代码的基础上新增一些功能代码或者是完善一个功能!
面向对象编程:
原有类的基础上创建新的类出来,新的类中可以直接使用原来类中的内容,新的类中可以增加新的数据成员和成员函数!
继承的好处:
减少代码冗余、提高开发效率、减少出错!
什么使用继承:
一个类是另外一个类的特殊版本的时候,就可以使用继承!
父类与子类
父类:已经存在的类
子类:新创建的类
![](https://i-blog.csdnimg.cn/blog_migrate/737edfaa5e282be01c4e9ee1b3117b73.png)
继承是如何继承的呢?
子类继承父类的所有(数据成员和成员函数) 友元是否会被继承?不会被继承,因为他不是类的成员,不具有传递性!构造函数和析构函数是不会被继承!
继承的格式是什么样子的?
Class子类名:继承方式 父类名{};
继承方式有三种:
Public继承:
Private继承:
Protected继承:
人类 ---》 老师类
<1>验证了父类的数据成员确实被子类继承了
![](https://i-blog.csdnimg.cn/blog_migrate/aae4361f473bac77b32c4b3da35003f4.png)
<2>.验证了父类的成员函数被子类继承
![](https://i-blog.csdnimg.cn/blog_migrate/0aa5d1339fbe7e8854be2c556ce76bb7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9e0e28f7df8555941270397adee1094b.png)
Protected的数据成员在子类中是可以使用!
![](https://i-blog.csdnimg.cn/blog_migrate/54ee4d9a2508a7648aefe3038d8ccd66.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7ef12e13109949347b77351562a52c15.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a04946001078b8a3df881ad3e322f2c0.png)
总结:
只有public方式继承,父类的成员访问权限和原来是一样的!
用private、protected方式继承,父类的public成员在子类外都不可访问!
3. 一般都使用public方式继承!
父类的protected成员在子类内可以访问!
继承关系中子类的构造函数
![](https://i-blog.csdnimg.cn/blog_migrate/321245cc1819a164030a7d32ce0f417d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7960fe626c50ffd2d974078787a6cd40.png)
在继承关系中,创建父类对象,只会执行父类的构造函数!
在继承关系中,创建子类对象,会先执行父类的构造函数,再执行子类的构造函数;
创建父类与子类对象的时候,在内存中是什么样子的?
![](https://i-blog.csdnimg.cn/blog_migrate/c7414d57a99eda41f5f96a787522c0ca.png)
继承关系中子类的析构函数
先构造的后析构
![](https://i-blog.csdnimg.cn/blog_migrate/69a06e3f3efc909210b93fbeeaff1352.png)
题目:看程序写运行结果!!!!
多层继承
A——》B—》C—》D
人类—》工人类—》教师类
创建子类对象,构造的执行顺序是先执行最上层的父类的构造函数,依次往下执行,最后走才是自己的构造函数!
![](https://i-blog.csdnimg.cn/blog_migrate/de75f5a1a6428996e3a77fbbdd0acc92.png)
当我们子类中有和父类同名的成员函数存在的时候,父类同名的成员函数被隐藏,如果通过子类对象直接去调用的话,执行的是子类的成员函数;
要想让执行父类的同名函数:要指定归属!
![](https://i-blog.csdnimg.cn/blog_migrate/90f64d473d924f2e93a3549f6468f82c.png)
为什么要在子类中定义和父类同名的成员函数呢?
就是因为要实现同样的功能,子类的做法和父类的做法是不同的!
重定义(隐藏):子类定义了和父类同名的函数!因为从父类继承下来的方法实现的效果满足不了子类的需求!
多重继承
A==》B
A==》C
B 和c可以同时被 D继承!
一个子类有多个父类
打印机
复印机-----打印复印一体机
人—》农民类
人—》工人类
农民工: 继承了农民的属性和行为,也继承了工人的属性和行为
![](https://i-blog.csdnimg.cn/blog_migrate/d5dcce5997baf1fec8e2776a6d9a9f36.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9f61b0fe313731d0b64d8aecd59bdb83.png)
![](https://i-blog.csdnimg.cn/blog_migrate/06c346e30e56b536f6cd0de3433a248f.png)
原因是什么?
FarmerWorker类继承于Farmer类,也继承于Worker类;Farmer类继承了Person类,Worker也继承了Pesron类;
那就说明在FarmerWorker中有两份来自于Person中的内容!一份来源于Farmer,一份来源于Worker,访问的时候就不清楚!
怎么解决:
虚继承!
![](https://i-blog.csdnimg.cn/blog_migrate/51f11d24d59dda0e74b825aa425c7851.png)
![](https://i-blog.csdnimg.cn/blog_migrate/575a8478a5743cf7d8d3422c95d74b9a.png)
原理是什么样子的?
![](https://i-blog.csdnimg.cn/blog_migrate/2968469f5dfbbb554ba6e16f777d614b.png)
验证对象占的内存空间:
![](https://i-blog.csdnimg.cn/blog_migrate/db331aba0b847fda6cfce25ab5b8f7d9.png)
虚继承额外的4字节在创建对象的时候是先分配的!
内存空间的分配就按如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/da5933c4bbcff6361cbe77ec52156350.png)
类与类之间的关系
<1>.继承关系: is a
中学是学校的一个特殊版本
标签、编辑框、按钮这三种都是控件
<2>.包含关系: has a
人体内包含心脏!
登录界面是由标签、编辑框、按钮组成!