>>>. map与set的区别是什么,各有哪些优势?
 
map中存储的数据是以键值对(key - value)形式并且通过排序(比较key,默认以 '<' 方式排序)存在的(每个key只能出现一次),set中存储的数据是以值单独通过排序(默认以 '<' 方式排序)存储(每个值只能出现一次), 对map和set容器进行迭代时都可以获得一个有序序列
 
>对于map来说,由于是关联容器,所以提供一对一的数据处理,而且可以使用 [ ](下标访问符),在 [ ] 中放入key,就可以得到key对应的value
>而对于set来说,可以通过自身值唯一性质来做数据的‘去重’操作
>注意:
map/multimap存储的是真正的键值对,set只存放value,但是set底层实际存放的是由value-value组成的键值对。
set中不允许修改元素(一般都为const类型),只能进行插入或者删除,map中也不允许修改key值,但是可以修改key对应的value
map与set查找效率都为O(log2N),底层实现都为红黑树
 
>>>. 红黑树是如何插入,如何旋转的。
 
红黑树也就是二叉搜索树,所以插入首先按照二叉搜索树方式插入,插入后观察各节点颜色是否满足红黑树性质(即根为黑,父母红则双子节点黑,叶子结点黑(包括空结点),每个结点到叶子结点简单路径上的黑结点数相同,以上4点)
所以插入后会出现以下几种情况:(cur为当前插入的结点)
>1.cur的父母结点(p)及其兄弟节点(u)为红,祖父节点(g)为黑

此时解决方法如图,将p,u 置为红,将g置为黑,之后继续向上调整(g看做cur继续调整)

>2.p与u为红,g为黑

此时需要分情况进行:

若是p为g的左孩子,cur为p的左孩子,则进行右单旋转,然后p置为黑,g置为红(图示)。
若是p为g的右孩子,cur为p的右孩子(前一种对称翻转),则进行左单旋转,然后p置为黑,g置为红.
 

>3.p为红,g与u为黑(或者无u)

p为g的左孩子,cur为p的右孩子,则针对p做左单旋转

p为g的右孩子,cur为p的左孩子(前一种对称翻转),则针对p做右单旋转

则都可以转换为情况2,再根据情况2进行调整
 
>>>. map的迭代器会失效吗,什么情况下失效,如何处理。
 
与vector迭代器失效的场景相似,map的迭代器也会失效,如以下代码:
for (iter = dataMap.begin(); iter != dataMap.end();iter++){

int nKey = iter->first;

string strValue = iter->second;

if (nKey % 2 == 0){
dataMap.erase(iter);
//此时iter已经失效了,进入下一次循环++时就会报错
}
}
//这里有一个常见误区,就是map与vector的erase操作返回值是不同的
//vector中erase执行结束会返回删除元素的下一个元素的迭代器。如下
vector<int> v={1,2,3,4,5};
auto it=v.begin();
for(;it!=v.end();){
if(*it%2){
it=v.erase(it); //这一句执行完后it指向的是4,erase会自动移位
}
else it++;
}

//但是map中的erase不会自动移位,所以为了防止迭代器失效,通常使用以下两种方法编写:
//1
map<int,string> m;for (auto it = m.begin(); it != m.end();){
if (it->first % 2){
auto it1=it;
it++;
m.erase(it1);
}
else
it++;
}
//2
……
for (auto it = m.begin(); it != m.end();){
if (it->first % 2){
m.erase(it++); //使用++进行移位,此时it不会失效,因为++运算返回的是运算前的值
}
else
it++;
}
 
>>>. AVL数和红黑树相比,为什么map和set使用了红黑树,红黑树的优势是什么?
 
首先,AVL数和红黑树都是高效的二叉搜索树。红黑树并没有追求绝对的平衡,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL有着平衡因子大于等于-1小于等于1的设定,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。
 
虽然红黑树的查询性能略微逊色于AVL树(毕竟趋近绝对平衡),但是红黑树在插入和删除上优于AVL树,AVL树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于AVL树为了维持平衡的开销要小得多。
 
所以若搜索的次数远远大于插入和删除,那么选择AVL,如果搜索,插入删除次数几乎差不多,应该选择红黑树。也是出于这种综合性能的考虑所以实际运用中红黑树更多
 
最后祝各位生活愉快~~
 
 
 

面试可能遇到的关联式容器(map、set等)相关问题的更多相关文章

  1. Map(关联式容器)

    map是一类关联式容器,自动建立Key - Value的对应 , key 和 Value可以是任意你需要的类型.下面介绍 map 中一些常用的函数: 一.map 中的 begin 和 end 函数 m ...

  2. STL源码分析读书笔记--第5章--关联式容器

    1.关联式容器的概念 上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引.它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是 ...

  3. 关联式容器(associative containers)

    关联式容器(associative containers) 根据数据在容器中的排列特性,容器可分为序列式(sequence)和关联式(associative)两种. 标准的STL关联式容器分为set( ...

  4. C++ 容器:顺序性容器、关联式容器和容器适配器

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  5. 7.7 C++基本关联式容器

    参考:http://www.weixueyuan.net/view/6404.html 总结: 基本的关联式容器主要有:set.multiset.map和multimap,这四种容器可以分为两组:ma ...

  6. STL——关联式容器

    一.关联式容器 标准的STL关联式容器分为set(集合)/map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和 multimap(多键映射表).这些容器的底层机制均以RB-tre ...

  7. STL学习笔记--关联式容器

    关联式容器依据特定的排序准则,自动为其元素排序.缺省情况下以operator<进行比较.set multiset map multimap是一种非线性的树结构,具体的说是采用一种比较高效的特殊平 ...

  8. C++关联式容器的排序准则

    stl中set和map为关联式容器,会根据排序准将元素自动排序.原型如下: template<class _Kty, class _Pr = less<_Kty>, class _A ...

  9. STL学习笔记(关联式容器)

    Set和Multisets set和multiset会根据特定的排序准则,自动将元素排序.两者不同在于multisets允许元素重复而set不允许. 1.set和multiset的操作函数 生成.复制 ...

随机推荐

  1. 0基础掌握接口测试神器-Postman

    一:Postman环境搭建 1:postman是什么?Postman是一款功能强大的网页调试与发送网页HTTP请求的接口测试工具.2:postman有几种安装方式?两种,应用程序和浏览器插件 3:po ...

  2. RabbitMQ高级之如何保证消息可靠性?

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第四弹. RabbitMQ我已经写了三篇了,基础的收发消息和基础的概念我都已经写了,学任何东西都是这样,先 ...

  3. 科普,想成为厉害的 Java 后端程序员,你需要懂这 13 个知识点

    老读者就请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 站 ...

  4. mysql再回首

    Mysql与Oracle的区别 1.实例区别 Mysql是一个轻量型数据库,开源免费.Oracle是收费的而且价格非常高. Mysql一个实例可以操作多个库,而Oracle一个实例只能对应一个库. M ...

  5. 读取手机中的联系人信息(android.provider.ContactsContract)

    本篇开始讲如何从Android中得到本机联系人的信息.由于Android较快的版本升级,部分API已经发生了变化.本篇探究的通过ContentProvider机制获取联系人的API从Android2. ...

  6. TinkPHP框架开发的CRMEB小程序商城v4.0二次开发集成支付宝支付

    前言 大家都知道支付宝支付和微信支付宝都只能局限在自己的平台,微信内支付宝支付是根本就不能使用,即使是公众号支付也需要跳转到外部浏览器才可以唤起支付宝支付,并且QQ浏览器唤起支付宝支付还是问题很多,所 ...

  7. 华为荣耀5X(畅玩版 全网通)USB调试模式如何开启教程(开发者模式 开发者选项打开)

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, 前一段时间,公司买了一款华为荣耀畅玩版5X全网通,进行测试.发现 拿usb数据线连接PC电脑,无法进 ...

  8. Unity2018.4.7导出Xcode工程报错解决方案

    1. unity导出xcode工程有两种模式,一种为模拟器运行的工程,一种为真机运行的工程,这里遇到的错误,都是导出模拟器运行工程时报的错误. 错误1: unity UnityMetalSupport ...

  9. [V&N公开赛] CheckIn

    V&N战队考核+招新,赵师傅出的Web题,做着感觉有点顶,趁热打铁写write up记录一下考察的知识点 这道题说是CheckIn其实还是有一定难度的(也可能是我太菜了),进入题目直接给出了f ...

  10. HTTP协议中的提交方式和解释POST、GET、HEAD、PUT等

    最基本的方法有4种,分别是GET,POST,PUT,DELETE HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作 GET一般用于获取/查询资源信息,而PO ...