红黑树

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. 入门OJ:郭嘉的消息传递

    题目描述 我们的郭嘉大大在曹操这过得逍遥自在,但是有一天曹操给了他一个任务,在建邺城内有N(<=1000)个袁绍的奸细 将他们从1到N进行编号,同时他们之间存在一种传递关系,即若C[i,j]=1 ...

  2. python 编译EXE文件

    以labelme测试 标注工具labelimg和labelme 矩形标注工具:labelimg 多边形标准工具:labelme 前者官网发布了可执行文件,后者只有python源码,如果需要编译wind ...

  3. std::async的使用总结

    C++98标准中并没有线程库的存在,直到C++11中才终于提供了多线程的标准库,提供了管理线程.保护共享数据.线程间同步操作.原子操作等类.多线程库对应的头文件是#include <thread ...

  4. 阿里云镜像仓库镜像迁移至私有Harbor

    下载镜像同步工具 wget https://goodrain-delivery.oss-cn-hangzhou.aliyuncs.com/boe/image-syncer && chm ...

  5. kvm实战

    1. 安装环境 # yum install qemu-kvm libvirt virt-install virt-manager virt-viewer -y # systemctl start li ...

  6. MySQL如何加锁控制并发

    目录 前言 一.乐观锁 添加version字段 二.悲观锁 读锁 全表锁(LOCK TABLE 表 READ) 行锁(SELECT ... LOCK IN SHARE MODE) 写锁 全表锁(LOC ...

  7. IDEA_2019.1版本中Protobuf的使用

    一.Protobuf是什么 Protobuf 是 Google 发布的开源项目,全称 Google Protocol(/'prəʊtəkɒl/,协议,草案) Buffers,是一种轻便高效的结构化数据 ...

  8. Server:www121 Server:www120 Server:NWS_SP 内容被散列,并在响应中放入Etag When to Use Entity-Tags and Last-Modified Dates

    1 Request URL:http://www.biyao.com/minisite/bzzx 2 Request Method:GET 3 Status Code:200 OK 4 Remote ...

  9. (Oracle)数据量统计存储过程

    本过程适用于Oracle数据量统计. create or replace procedure SP_GET_TAB_COUNT as v_tableName HDSD_TJ.Tablename%typ ...

  10. 从输入URL到页面展示,这中间都发生了什么?

    前言 在浏览器里,从用户输入URL到页面展示,这中间都发生了什么?这是一道非常经典的面试题.这里边涉及很多知识点,比如:网络协议.页面渲染.操作系统等.所以这是很好很全面的考察一个前端的知识.下面我将 ...