set 不允许用户更改key,是通过将 key 的迭代器设置为 const,map 不允许用户更改 key ,是在构建底层的实现的时候将 key 设置为 const 。
功能一致,都是将容器的第一个返回。
multimap 不能通过 [ ] 号来进行增加。
map 具有下标访问函数,存在对应的 key ,就直接返回 value,如果不存在对用的 key ,就创建一个,若没有 value ,就使用 default value。
校招相关问题的补充:
1、set 和 map 是怎么实现的?红黑树是怎么能够同时实现这两种容器的?为什么使用红黑树?
1)它们的底层结构都是通过红黑树实现,插入和删除的时间复杂度都是 O(logn),实现了高效的删除和插入。
2)在定义的参数模板中,如果只有 key 那它是 set,如果是 key 和 T 那它是map ,底层都由红黑树实现。实现 set 的节点是数据类型是 value ,实现 map 的节点的数据类型是 key + value 。
3)set 和 map 要求自动排序,红黑树能够实现这一功能。
2、map 的插入方式有哪几种?
1)使用 insert 插入 pair;
//map.insert(pair<1,"hello">);
map.insert(pair<int,string>(1,"hello");
2)在 insert 函数中使用 make_pair 函数 ;
map.insert(make_pair(1,"hello"));
3)使用 insert 函数加入 value_type 数据;
map.insert(map<int,string>::value_type(1,"hello"));
4)使用类似数组的方式插入数据。
map[1] = "hello";
3、map 中 [ ] 与 find 的区别是?
1)[ ] 的作用是,将 [ ] 当中的 key 作为关键字去查找相对应的值,如果要查找的值存在,就返回值;如果要查找的值不存在,就将用于查找的关键字和默认值作为节点插入 map 当中。
2)用关键码进行查找,找到了返回该位置的迭代器,如果没有找到就返回尾部迭代器。
4、STL 当中 map 的实现?
1)map 的特性:
依据键值自动进行排序,
其所有的元素都是 pair 并且分为 key 和 value 两个部分,
不允许元素具有相同的 key;
2)map 当中的 key 不可以更改,value 可以更改,故使用的不是 constant iterator 而是使用 constant key;
3)标准 STL 当中的 map 使用 RB_tree 来实现,另一种以 hash_table 来实现的叫做hash_map;