6.关联容器

来源:互联网 发布:超高温灭菌牛奶 知乎 编辑:程序博客网 时间:2024/06/05 21:50

前言:今天下午接到了百度的电话面试,被虐得体无完肤。。所以立马决定刷题。

正文:set容器是STL中的关联容器,是基于红黑树的。

需要包含头文件:

#include <set>

Set、multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素。

set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。set是单纯的键的集合。set不支持下标操作

自动排序的优点是使得搜寻元素时具有良好的性能,具有对数时间复杂度。但是造成的一个缺点就是:

不能直接改变元素值。因为这样会打乱原有的顺序。

改变元素值的方法是:先删除旧元素,再插入新元素。

存取元素只能通过迭代器,从迭代器的角度看,元素值是常数。

set的基本操作:

begin()         返回指向第一个元素的迭代器

clear()         清除所有元素

count()         返回某个值元素的个数,只返回0或1

empty()         如果集合为空,返回true

end()           返回指向最后一个元素的迭代器

erase()         删除集合中的元素

find()          返回一个指向被查找到元素的迭代器

insert()        在集合中插入元素,与map容器一样,带有一个键参数的insert返回pair类型,包含一个迭代器和一个bool类型,使用迭代器对的insert返回void类型

max_size()      返回集合能容纳的元素的最大限值

size()          集合中元素的数目

swap()          交换两个集合变量

set<type, op>:以op为排序法则的set
set<type>:以less<>为排序法则的set 
set<int> s1;创建一个空的set,元素类型为int
s1.insert(10);插入10
s1.erase(s1.begin());删除特定元素
s1.erase(10);删除10

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容器时,迭代器指向的元素按键的升序排列。

0 0
原创粉丝点击