前言:今天下午接到了百度的电话面试,被虐得体无完肤。。所以立马决定刷题。
正文:set容器是STL中的关联容器,是基于红黑树的。
需要包含头文件:
#include <set>
Set、multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素。
set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。set是单纯的键的集合。set不支持下标操作
自动排序的优点是使得搜寻元素时具有良好的性能,具有对数时间复杂度。但是造成的一个缺点就是:
不能直接改变元素值。因为这样会打乱原有的顺序。
改变元素值的方法是:先删除旧元素,再插入新元素。
存取元素只能通过迭代器,从迭代器的角度看,元素值是常数。
set的基本操作:
begin()
clear()
count()
empty()
end()
erase()
find()
insert()
max_size()
size()
swap()
set容器的insert接口(键参数版本)返回的是一个pair<iterator,bool>,而multiset容器的insert接口直接返回一个iterator。这是因为set容器中不允许有重复的元素,如果容器中已经存在一个跟插入值相同的元素,那么插入操作就会失败,而pair中的bool值就是标识插入是否成功的。而multiset不存在这个问题。
二、map
map是键-值对的集合,可使用键作为下标来获取一个值。map<k,v> m;//创建一个名为m的空map对象,键和值得类型分别为k和v。
map内部自建一颗红黑树,这棵树对数据具有自动排序的功能。(键:严格弱排序)??
使用map时,必须包含头文件#include<map>。
1.插入元素
(1)用数组方式插入
map<string,int> word_count;//空map
word_count["Anna"]=1;//在word_count中查找键为Anna的元素,没找到则插入一个键为Anna的元素
map下标操作返回的左值是特定键所关联的值
(2)insert
word_count.insert(pair<string,int>("Liming",1));//用insert函数插入pair数据
word_count.insert(map<string,int>::value_type("Leila",1));//用insert函数插入value_type数据
2.查找元素
count和find,用于检测某个键是否存在而不会插入该键
m.count(k);//返回m中k的出现次数,map只允许一个键对应一个实例,故返回值只能是0或1
m.find(k);//如果m中存在k索引的元素,则返回指向该元素的迭代器,否则返回超出末端迭代器
3.删除元素
map容器的erase操作返回void,而顺序容器的erase操作返回一个指向被删除元素后面的元素的迭代器。
m.erase(k);//删除m中键为k的元素,返回size_type类型的值,表示删除的元素个数
m.erase(p);//从m中删除迭代器p所指向的元素,p必须指向m中确实存在的元素,而且不能等于m.end()。返回void类型
m.erase(b,e);//从m中删除迭代器b和e范围内的元素
4.map迭代器
map<string,int>::const_iterator map_it=word_count.begin();
在使用迭代器遍历map容器时,迭代器指向的元素按键的升序排列。