红黑树

references:

红黑树详细分析,看了都说好


关于红黑树(R-B tree)原理,看这篇如何

性质:

1、节点是红色或黑色

2、根节点是黑色

3、叶子节点(叶子节点均为NULL)都是黑色

4、红色节点必有两个黑色子节点

5、从任一节点到其每个叶子节点的所有简单路径都包含相同数目的黑色节点

操作:

1、旋转

左旋:节点变成右孩子的左孩子

右旋:节点变成左孩子的右孩子



2、变色

改变节点颜色

5种插入情况

删除(未学)

map,set的区别与实现

references:

nowcoder


20190801-C++中map和set的使用与区别

底层实现都是红黑树。

区别:

(1)map中的元素是key-value(关键字—值)对;set只有关键字没有值(或者说关键字就是值)。

(2)set的迭代器是const的,不允许修改值;map能修改值,不能修改键。

(3)map支持下标操作,set不支持。map可以用key做下标,map的下标运算符[ ]将关键码作为下标去执行查找,如果关键码不存在,则插入一个具有该关键码和mapped_type类型默认值的元素至map中,因此下标运算符[ ]在map应用中需要慎用,const_map不能用,只希望确定某一个关键值是否存在而不希望插入元素时也不应该使用,mapped_type类型没有默认值也不应该使用。如果find能解决需要,尽可能用find。

介绍一下STL的allocaotr

references:

STL的allocaotr

STL的分配器用于封装STL容器在内存管理上的底层细节。在C++中,其内存配置和释放如下:

new运算分两个阶段:(1)调用::operator new配置内存(重载new);(2)调用对象构造函数构造对象内容

delete运算分两个阶段:(1)调用对象希构函数;(2)调用::operator delete释放内存(重载delete)。

为了精密分工,STL allocator将两个阶段操作区分开来:内存配置有alloc::allocate()负责;内存释放alloc::deallocate()负责;对象构造由alloc::construct()负责;对象析构由alloc::destroy()负责。

#include<cstdio>
#include<memory>
#include<iostream>
using namespace std; int main(){
int n;
allocator<string> alloc;
auto const p = alloc.allocate(n); //分配内存,p是第一个的地址
auto q = p; //q与p相当于队列head和tail alloc.construct(q++, "123456"); //第一个对象构造
alloc.construct(q++, "654321"); //第二个对象构造
cout << *p << endl; //只能访问到第一个
cout << p[0] << endl;
cout << p[1] << endl; while(p != q) alloc.destroy(--q); //构造的全部析构
alloc.deallocate(p, n); //释放内存 return 0;
}

STL迭代器

references:

nowcoder

这个主要考察的是迭代器失效的问题。

1.对于顺序容器vector,deque来说,使用erase(itertor)后,后边的每个元素的迭代器都会失效,但是后边每个元素都会往前移动一个位置,但是erase会返回下一个有效的迭代器;

2.对于关联容器map,set来说,使用了erase(iterator)后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素的,不会影响到下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。【实际操作中在windows平台的STL里erase也会返回下一个迭代器】

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

STL的基本组成

references:

STL是什么(STL简介)

STL由六大组件构成,容器,算法,迭代器,仿函数,适配器,和配置器。

容器:STL提供的存放数据的类

算法:处理元素的方法和操作

迭代器:为容器提供一组公共接口。

仿函数:仿函数具有泛型编程强大的威力,是纯粹抽象概念的例证。(仿函数本质就是类重载了一个operator(),创建一个行为类似函数的对象。)

class Mul{

public:

int operator()(const int &a , const int &b) {

\(\quad\) return a * b;

}

};

int main(){

\(\quad\) cout << Mul()(1, 2);

\(\quad\) return 0;

}

配接器:实现不同类之间的数据转换。(stack和queue就是从deque来的)

分配器:内存管理。

vector和list

references:

nowcoder

vector底层实现是动态数组,所以有数组的特点。vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。

list底层是双向链表。list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。

迭代器的作用,为什么有了指针还需要迭代器

迭代器是访问容器的接口,他重载了很多类似指针的操作(++,--,*等),迭代器返回的是对象的引用而不是其本身。

出现的原因:

因为STL中容器都封装起来了,所以需要迭代器去访问,使得不用暴露容器的内部结构也能访问其数据。

resize和reserve

references:

STL方法中,resize()和reserve()的区别和用途

resize():改变当前容器内含有元素的数量。如果变大了,新增的为0。

reserve():指定容器能存储多少个元素。如果大于capacity,那么新找一块能分配那么大的内存空间,并复制之前的内容。如果reverse小于当前的size,那么他什么都不会做。

capacity:当前容器能存储多少个元素

n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)

维护一个递减的单调栈。

C++ part4的更多相关文章

  1. R语言做文本挖掘 Part4文本分类

    Part4文本分类 Part3文本聚类提到过.与聚类分类的简单差异. 那么,我们需要理清训练集的分类,有明白分类的文本:測试集,能够就用训练集来替代.预測集,就是未分类的文本.是分类方法最后的应用实现 ...

  2. Python学习 Part4:模块

    Python学习 Part4:模块 1. 模块是将定义保存在一个文件中的方法,然后在脚本中或解释器的交互实例中使用.模块中的定义可以被导入到其他模块或者main模块. 模块就是一个包含Python定义 ...

  3. [转] Foobar2000 DSP音效外挂元件-Part4

    [转] Foobar2000 DSP音效外挂元件-Part4 在第1部分的文章里主要介绍了foobar2000预设的DSP音效调整,这些则示要介绍几个比较会用到的DSP外挂元件,在foobar2000 ...

  4. Java实例 Part4:数组及其常用操作

    目录 Part4:数组及其常用操作 Example01:将二维数组的行列交换 Example02:使用选择排序法对数组进行排序 Example03:使用冒泡排序法对数组进行排序 Example04:使 ...

  5. SQL Server 2012安装配置(Part4 )

    SQL Server 2012安装配置(Part1) SQL Server 2012安装配置(Part2) SQL Server 2012安装配置(Part3 ) SQL Server 2012安装配 ...

  6. JS---part5 课程介绍 & part4 复习

    part5 课程介绍 另一个定时器 第一个定时器的小案例----练习 封装动画函数----------匀速的动画函数,过渡到=======>缓动的动画函数 简单的轮播图 左右焦点的轮播图 无缝连 ...

  7. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  8. 面向对象Part4

    ---------------------------------------------------------------------------------------------------- ...

  9. “全能”选手—Django 1.10文档中文版Part4

    第一部分传送门 第二部分传送门 第三部分传送门 3.2 模型和数据库Models and databases 3.2.2 查询操作making queries 3.3.8 会话sessions 2.1 ...

  10. 遗传算法在JobShop中的应用研究(part4:变异)

    下面,我们以车间调度为例来谈谈遗传算法中的另一个重要操作变异.变异操作通常发生在交叉操作之后,它的操作对象是交叉得到的新染色体.在本文中我们通过随机交换染色体的两个位置上的值来得到变异后的染色体,变异 ...

随机推荐

  1. mybatis-plubs条件构造器中的方法所对应的sql语法

    [通用条件:] [比较大小: ( =, <>, >, >=, <, <= )] eq(R column, Object val); // 等价于 =,例: eq(& ...

  2. linux中的虚拟环境工具

    1.虚拟环境工具的学习 python的虚拟环境,其实就是在机器上,方便的创建出多个解释器,每个解释器运行一个项目,互相之间不受影响 2.virtualenv工具,可以方便的创建,使用,删除也很方便 3 ...

  3. java之 Request

    0x01.Request 什么是request 在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用来封装HTTP请求消息. ...

  4. 六个你不知道的PR快捷键,拯救你的剪辑效率

    5G时代到来,会剪辑视频的人,无论在校园还是未来步入职场都很吃香.对于普通人来说,视频处理也成为了一个通用技能.PR是我们大多数人剪辑中,经常会用到的剪辑工具,之前的文章中已经给大家总结了pr的一些提 ...

  5. java虚拟机入门(二)-探索内存世界

    上节简单介绍了一下jvm的内存布局以及简单概念,那么对于虚拟机来说,它是怎么一步步的让我们能执行方法的呢: 1.首先,jvm启动时,跟个小领导一样会根据配置参数(没有配置的话jvm会有默认值)向大领导 ...

  6. Arduino 上手实战呼吸灯

    前言 这篇稿子比以往的时候来的稍晚了一些,望fans们见谅,那即便如此,最终还是姗姗来迟了,公司新一轮战略性部署,被拖出去孵化新产品,开拓新市场去了,手头精力没有那么多了,另外产品一茬接一茬.韭菜一波 ...

  7. Connection Manager简称connman

    ConnMan    Connection Manager简称connman,connman是使用d-bus做为进程间通信机制来管理Linux网络链接的一种软件.在connman的d-bus接口中,有 ...

  8. InnoDB 事务隔离级探索

    https://mp.weixin.qq.com/s/gWYL2Th9Go5LDhkyGB_rYQ

  9. Java AQS的原理

    首先可以看:  http://ifeve.com/java-special-troops-aqs/ 再看  <Java并发编程的艺术>第5章 核心:同步器的acquire方法: 首先调用自 ...

  10. EasyExcel导出小结:动态标题、标题格式、相同值合并

    1. 实列相关依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel& ...