红黑树

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. 全栈性能测试修炼宝典-JMeter实战笔记(一)

    了解性能测试 性能测试不仅能够定位.分析问题,还要把握系统性能变化趋势:性能测试工程师能够帮助解决性能问题,搞定测试过程中的各种不合理配置,给出专业的优化建议. 第一章 性能方向职业发展 软件测试职业 ...

  2. 时序数据库 Apache-IoTDB 源码解析之元数据索引块(六)

    上一章聊到 TsFile 索引块的详细介绍,以及一个查询所经过的步骤.详情请见: 时序数据库 Apache-IoTDB 源码解析之文件索引块(五) 打一波广告,欢迎大家访问 IoTDB 仓库,求一波 ...

  3. 浅析Redis与IO多路复用器原理

    为什么Redis使用多路复用I/O Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导 ...

  4. Uber如何解决2000多个微服务带来的复杂性问题?

    Uber如何解决2000多个微服务带来的复杂性问题? Adam Gluck 架构头条 2020-10-29 https://mp.weixin.qq.com/s/N7fVDZVm8uC9wVvd9DQ ...

  5. [JSOI2019]节日庆典 做题心得

    [JSOI2019]节日庆典 做题心得 一个性质有趣的字符串题 这要是在考场上我肯定做不出来吧 一开始还以为要 SAM 什么的暴力搞,没想到只用到了 \(Z\) 函数 -- 也是我生疏了罢 (学了啥忘 ...

  6. HMS Core华为分析丨受众细分,多场景促进精益运营

    用户的偏好不同,对产品的需求也不一样,要想更好地培养用户粘性,就需要因人施策,精细化运营,而受众细分是精细化运营的重要方法之一.受众细分是根据用户属性和行为数据,将具有相同或类似特征的用户归为一个群组 ...

  7. Language Guide (proto3) | proto3 语言指南(三)默认值

    默认值 解析消息时,如果编码的消息不包含特定的单数元素,则解析对象中的相应字段将设置为该字段的默认值.这些默认值是特定于类型的: string:默认值为空字符串 bytes:默认值为空字节 boole ...

  8. 日志框架(Log4J、SLF4J、Logback)--日志规范与实践

    文章目录 一.Log4j 1.1新建一个Java工程,导入Log4j包,pom文件中对应的配置代码如下: 1.2resources目录下创建log4j.properties文件. 1.3输出日志 1. ...

  9. VMware虚拟机串口与宿主机进行传输验证

    一.验证目的 1.验证VMWARE虚拟机(Windows或Linux)上的程序,是否可以读取宿主服务器的物理串口中的数据. 二.验证过程 1.验证条件及工具, 宿主机:Windows 10 x64 V ...

  10. 深入理解 ProtoBuf 原理与工程实践(概述)

    ProtoBuf 作为一种跨平台.语言无关.可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储.随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代R ...