C++深入分析STL中map容器的使用_第1页
C++深入分析STL中map容器的使用_第2页
C++深入分析STL中map容器的使用_第3页
C++深入分析STL中map容器的使用_第4页
C++深入分析STL中map容器的使用_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++深入分析STL中map容器的使用目录1、map容器2、map容器原理3、map容器函数接口4、使用示例

1、map容器

map是C++STL的一个关联容器,它提供一对一的数据处理能力。其中,各个键值对的键和值可以是任意数据类型,包括C++基本数据类型(int、double等)、使用结构体或类自定义的类型。

第一个可以称为关键字(key);

第二个可能称为该关键字的值(value);

该容器存储的都是pairconstK,T类型(其中K和T分别表示键和值的数据类型)的键值对元素。

使用map容器存储的各个键值对,键的值既不能重复也不能被修改。换句话说,map容器中存储的各个键值对不仅键的值独一无二,键的类型也会用const修饰,这意味着只要键值对被存储到map容器中,其键的值将不能再做任何修改。

2、map容器原理

map容器的实现是自建了一颗红黑树,这颗树具有对数据自动排序的功能,在map内部所有的数据都是有序的

3、map容器函数接口

begin()返回指向map头部的迭代器

clear()删除所有元素

count()返回指定元素出现的次数

empty()如果map为空则返回true

end()返回指向map末尾的迭代器

equal_range()返回特殊条目的迭代器对

erase()删除一个元素

find()查找一个元素

get_allocator()返回map的配置器

insert()插入元素

key_comp()返回比较元素key的函数

lower_bound()返回键值=给定元素的第一个位置

max_size()返回可以容纳的最大元素个数

rbegin()返回一个指向map尾部的逆向迭代器

rend()返回一个指向map头部的逆向迭代器

size()返回map中元素的个数

swap()交换两个map

upper_bound()返回键值给定元素的第一个位置

value_comp()返回比较元素value的函数

mapkey,value//创建一个名为m的空map对象,其键和值的类型分别为key和value。

mapkey,valuem(m2);//创建m2的副本m,m与m2必须有相同的键类型和值类型。

mapkey,valuem(b,e);//创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转换为pair

//查

m.count(k);//返回m中键值等于k的元素的个数。

m.find(k);//如果m中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回结束游标end()。

//删

//迭代器刪除

iter=m.find(123

m.erase(iter);

//用关键字刪除

intn=m.erase(123//如果刪除了會返回1,否則返回0

//用迭代器范围刪除:把整个map清空

m.erase(m.begin(),m.end());

//等同于m.clear()

m.erase(k);//删除m中键为k的元素,返回size_type类型的值,表示删除元素的个数。

m.erase(p);//从m中删除迭代器p所指向的元素,p必须指向m中确实存在的元素,而且不能等于m.end(),返回void类型。

m.erase(iteratorfirst,iteratorlast);//删除一个范围,返回void类型。

//插入

//第一种用insert函數插入pair

m.insert(pairint,string(000,student_zero));

//第二种用insert函数插入value_type数据

m.insert(mapint,string::value_type(001,student_one));

//第三种用array方式插入

m[123]=student_first

m[456]=student_second

m.insert(e);

e是一个用在m上的value_type类型的值。如果键e.first不在m中,则插入一个值为e.second的新元素;如果该键在m中已存在,那么不进行任何操作。该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素。

m.insert(beg,end);

beg和end是标记元素范围的迭代器,对于该范围内的所有元素,如果它的键在m中不存在,则将该键及其关联的值插入到m。返回void类型。

m.insert(iter,e);

e是value_type类型的值,如果e.first不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置,返回一个迭代器,指向m中具有给定键的元素。在添加新的map元素时,使用insert成员可避免使用下标操作符带来的副作用:不必要的初始化。

//在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:intnSize=mapStudent.size();

pairmapint,string::iterator,boolInsert_Pair;

Insert_Pair=mapStudent.insert(mapint,string::value_type(1,student_one));

我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。

4、使用示例

(1)插入

insert函数插入pair数据

std::mapint,std::stringmapPerson;

mapPerson.insert(pairint,string(1,Jim));

insert函数插入value_type数据

mapPerson.insert(std::mapint,std::string::value_type(2,Tom));

用数组方式插入数据

mapPerson[3]=Jerry

(2)遍历

前向迭代器

std::mapint,std::string::iteratorit;

std::mapint,std::string::iteratoritEnd;

it=mapPerson.begin();

itEnd=mapPerson.end();

while(it!=itEnd)

coutit-first''it-secondendl;

it++;

}

反向迭代器

std::mapint,string::reverse_iteratoriter;

for(iter=mapPerson.rbegin();iter!=mapPerson.rend();iter++)

coutiter-first""iter-secondendl;

数组形式

mapPerson.insert(std::mapint,std::string::value_type(1,"Tom"));

mapPerson[2]="Jim";

mapPerson[3]="Jerry";

intnSize=mapPerson.size();

for(intn=1;n=nSize;n++)

qDebug()QString::fromStdString(mapPerson[n]);

(3)查找

三种数据查找方法

第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了

第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,

分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.

通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据iterator-first和iterator-second分别代表关键字和存储的数据。

mapint,string::iteratorl_it;;

l_it=maplive.find(112);

if(l_it==maplive.end())

cout"wedonotfind112"endl;

elsecout"wofind112"endl;

第三种:这个方法用来判定数据是否出现,是显得笨了点,

lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)

upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)

例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,

而upper-bound(2)的话,返回的就是3

Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字,

#includemap

#includestring

#includeiostream

usingnamespacestd;

intmain()

mapint,stringmapStudent;

mapStudent[1]="student_one";

mapStudent[3]="student_three";

mapStudent[5]="student_five";

mapint,string::iteratoriter;

iter=mapStudent.lower_bound(1);

//返回的是下界1的迭代器

coutiter-secondendl;

iter=mapStudent.lower_bound(2);

//返回的是下界3的迭代器

coutiter-secondendl;

iter=mapStudent.lower_bound(3);

//返回的是下界3的迭代器

coutiter-secondendl;

iter=mapStudent.upper_bound(2);

//返回的是上界3的迭代器

coutiter-secondendl;

iter=mapStudent.upper_bound(3);

//返回的是上界5的迭代器

coutiter-secondendl;

pairmapint,string::iterator,mapint,string::iteratormappair;

mappair=mapStudent.equal_range(2);

if(mappair.first==mappair.second)

cout"DonotFind"endl;

else

cout"Find"endl;

mappair=mapStudent.equal_range(3);

if(mappair.first==mappair.secon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论