map的下标操作符 操作符的实现:乍一看,return后面很复杂,现在我们将它一步步拆解,首先根据键值和实值创建一个元素,value_type(k,T()),再将该元素插入map中insert(value_type(k, T()))此时需要注意,map的取下标符号主要有两个功能即分别是左值和右值,如下代码所示:作为左值的情况,便是想为map增添新元素,当输入的key与原有map中的key不相等的情况下便插入,此时insert(value_type(k, T()))的返回值为pair...
(课外扩展)红黑树左右旋 左旋:以某个节点作为旋转点,其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,左子节点保持不变。右旋:以某个节点作为旋转点,其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,右子节点保持不变。如上图便是左旋的过程,将pr拉上去之后p下去。P做为pr的左节点之后断开rl(因为二叉树),因为rl也需要连接父节点,故最终rl做为p的右子节点。通过代码来理解左右旋的过程:/** * 围绕p左旋 * pf
薄膜干涉数据处理 首先记录一下关键变量, Absolute_phases为绝对相位差(就是上张图片和下张图片之间的相位差),min_xiangweicha 为最小绝对相位差,sum_total_xiangweicha为最小相位差总和(计算线性)。数据处理分为有无跨条纹两个过程,首先是无跨条纹的时候将最小绝对相位差放在A列,最小相位差总和放在B列,彩色共聚焦数据放在C列,用B,C列拟合出一条直线(薄膜干涉测量点和彩色共聚焦测量点若共线最直接的反应就是将产生一条线性非常好的拟合线)通过图获得直线的拟合方程,再将B
(课外扩展)2-3-4树和红黑树的关系 二叉树:查找前驱节点:小于当前节点的最大值。 查找后继节点:大于当前节点的最小值。(注:中序排序才有前驱节点和后继节点)二叉树的删除:叶子节点直接删除,因为没有子节点。 只有一个子节点的用子节点替代(本质上就是找前驱节点和后继节点,左节点为前驱节点,右节点为后继节点)。 有两个子节点的需找到替代节点(替代节点就是前驱节点或者后继节点,两个节点都可以)。如下图所示:如果我们要删除2节点,2节点的前驱节点为1.5后继节点为2.5,因此这两个节点均可以替代2节点。替代之后二叉树...
7、deque容器及stack和queue容器 容器deque是一个(分段)连续空间,在表现上是连续,实际上是分段。deque的迭代器分别有四个指针,cur,first,last,node,node指针指向控制中心,即map(map的组成原理是vector数组)。当cur达到了first或last的时候(first和last表示这段空间的首尾),通过map中的指针来指向下一段缓存区。start iterator是为了指明开始的一段缓存区 ,finish指向结束缓存区。接下来看一下deque源码(注意BufSiz):现列出deque的一个经...
6、vector深度探析 vector数据安排与操作和array相似。两者的区别在于array是静态空间一但确定大小就不能改变,要换大小只能有程序员去声明新的array空间,将旧空间的变量挨个赋值过去。而vector是动态空间,随着放入的元素增多,它的内部机制会自行扩充空间来容纳元素。首先来看看vector的源码...
5、迭代器设计原则和Iterator traits的作用与设计 迭代器的设计原则在上一节4、list深度探索_努力的小带土的博客-CSDN博客讲解list的时候,观察仔细的小伙伴一定注意到了,下面代码中五个typedef是迭代器中必不可少的组成部分。template<class T, class Ref, class Ptr>struct __list_iterator{ //所有的迭代器都要有这5个typedef typedef bidirectional_iterator_tag iterator_category;//(1) type
4、list深度探索 list的数据结构list不仅是一个双向链表,而且是一个环状的双向链表,因此它只需要一个指针,便可以完整的表现整个链表:template <class T, class Alloc = alloc>class list{protected: typedef __list_node<T> list_node;public: typedef list_node* link_type; typedef __list_iterator<T, T&, T
3、关联容器测试(multiset,multimap,set,map,unordered_multiset.......) 衔接上章https://blog.csdn.net/qq_42138448/article/details/124259469,本章主要内容还是讲解容器。关联容器主要优势是查找,但我们安插的时候,是按照顺序来安插,因此会稍微慢一点。multiset测试代码:#include <set>#include <iostream>#include <cstdlib>#include <ctime>namespace stl03{ void
2、容器的结构与分类,array容器的测试,vecotr容器的测试,以及其他顺序容器的一些细节 容器的结构与分类:首先介绍一下顺序容器:Array 是数组,确定了开始位置和结束位置,同时不能超出它的内存。Vector 确定了开始位置,但可以一直向后添加新的空间去存放元素。Deque 开始位置能够扩充并且结束位置也能够扩充List 双向链表,相比于Forward-List占用的内存更大,因为一个元素对应两个指针。Forward-List 单向列表,看下面的小图可知开始位置是确定的。关联容器:(一般用于查找)Set 中key和value是一样的,通过红黑树来编写。M
1、 STL的六大部件、c++11 遍历for循环以及auto 六大部件:分配器,容器,仿函数,算法,迭代器,适配器。它们之间互相有关系,容器是通过分配器来分配内存的。下例代码演示了六大部件如何操作:容器中值得注意的是:所有容器都是前闭后开区间,即c.begin()指向第一个元素,而c.end()指向的是最后一个元素中的下一个位置。因此若想要通过常规for循环遍历容器则方法为for(;ite != c.end();ite++)。现c++11给出一个更好的遍历方式,同时为了避免申明像Container<T>::iterator这样较为复
模板类,具体化 在申明模板类的开头应该使用:template<typename Type>,关键字template告诉编译器将要定义一个模板,Type是一个通用类型说明符,在使用模板时,将使用实际类型代替它,如(string或Int)。模板类的成员函数申明应该为:template<typename Type> bool Stack<Type>::push(),和普通函数不同之处便为函数限定符从Stack::改为Stack<Type>::。值得注意的是,模板类的应该和模板类的申
傅里叶变换 简答的理解,将频率为3的周期信号,通过不同的速度缠绕到圆上,在其他位置,该圆的质心均在原点,如下图所示:但是在速度为3 cycle/second的时候缠绕质心会很明显的偏向右侧,如下图所示:上述例子只是对单频率信号来讲解的,当我们把频率为2beats/second 信号与频率为3beats/second信号结合起来,在圆上进行缠绕,当缠绕速度为2cycle/scond时质心同样右偏在缠绕频率为3cycle/second的时候质心再次右偏上述所描述的一些列操作过程,便可将一系列..
多重继承(虚基类) 存在基类Worker,其中包含名字信息name(string)以及编号信息id(int),现有Singer和Waiter类均继承于Woker类,即 class Singer:public Worker{.....} ;和 class Waiter:public Worker{.......};。假设再由Singer和Waiter派生出SingingWaiter类即class SingingWaiter:public Singer,public Waiter{.....};因为Singer和Waiter.
使用using重新定义访问权限 在使用保护派生和私有派生时,基类的公有成员函数,将成为保护成员或私有成员。假设要让基类方法在派生类外可用,则此时就用到了using重新定义访问权限,假设存在以下类:class Student : private string, private valarray<double>{...public: using valarray<double>::min; using valarray<double>::max; ...};上述申明是的min()和
抽象类(简单描述) 使用一个通俗且易理解的方法来讲纯虚类,假设有动物类,但动物包含很多属性,比如牛可以算动物,牛的食物是草,但老虎也算动物,它的实物却是肉。在比如圆和椭圆,在数学定义中圆是属于特殊的椭圆,若我们按照定义去取椭圆为基类,会发现有很多不需要的点,比如椭圆存在长轴,短轴,同时椭圆旋转角度不一样,它的形状便不一样,这些对于圆来说都是不需要的,因此简单的将圆继承于椭圆显然不合适,因此便发明了抽象类。纯虚类的申明,首先依靠于纯虚函数,virtual void food() = 0; 便为纯虚函数,即在虚函数申明之后再在虚.
(virtual)虚函数 虚函数用在多态公有继承中,假设存在Brass类和BrassPlus类,且BrassPlus公有继承于Brass类,BrassPlus将针对自己的类属性,对Brass类部分公有函数进行更改,此时便需要申明virtual。如下例代码所示:class Brass{ private: string fullName; long acctNum; double balance; public: // 默认构造函数 Brass(string fn = "None", long