第十章 关联容器(上)

在将关联容器之前,我们首先了解都得是pair类型的数据。pair类型包含两个数据值,在创建pair类型的对象时,必须要提供两个类型名。即pair对象所包含的两个数据成员各自对应的类型名字。pair类型在utility的头文件中。

1.创建pair类型的对象:

pair<T1,T2>p1;创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化。

pair<T1,T2>p1(v1,v2);创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为V1,second成员初始化为V2。

make_pair(V1,V2);以V1,V2值创建一个新的pair对象,其中元素类型分别是V1和V2的类型。

p1<p2;两个pair对象之间的小于运算。如果p1.first<p2.first 或者 !(p2.first<p1.first)&&p1.second<p2.second,则返回ture

p1==p2;如果两个pair对象的first和second成员一次相等,则这两个对象相等。

p.first 返回p中名为first的数据成员

p.second 返回p中名为second的数据成员

2.关联容器:map,set,multimap,multiset。

map类型:map是键-值对的集合。可以使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。

(1)map对象的定义:

map<k,v>m;创建一个名为m的空map对象,其键和值的类型分别是K和V

map<k,v>m(m2);创建m2的副本m,m与m2必须有相同的键类型和值类型

map<k,v>m(b,e);创建一个map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本。元素的类型必须能转换或者是pair<const K,V>

建类型的约束:在使用关联容器时,它的键不但有一个类型,而且还有一个相关的比较函数。默认情况下,标准库使用键类型定义的<操作符来实现键的比较。

(2)map定义的类型

map<k,v>::key_type 在map容器中,用做索引的键的类型

map<k,v>::mapped_type 在map容器中,用做键关联的值的类型

map<k,v>::value_type 一个pair类型,它的first元素具有const map<k,v>::key_type类型,而second元素则为map<k,v>::mapped_type类型

map迭代器进行解引用将产生pair类型的对象:如:

map<string,int>imap;

map<string,int>::iterator iter=imap.begin();

cout<<iter->first<<" "<<iter->second<<endl;

++iter;

3.给map容器添加元素:

在定义了map容器之后,下一步就是要添加元素了,map容器添加元素的方法主要有两种:一、采用下标的方法。二、利用插入(insert)

一、下标法:

map<string,int>imap;                                   map<string,int>imap;

imap["liujiyu"]=1;                                         string word;

                        while(cin>>word)

                           ++imap[word];

下标法主要是通过相应的键来获取所关联的值,如果容器当中没有该键,则map将以该键以及该键所关联的值重新创建一个新的元素,并将它插入到map对象中。如果该键存在map容器中,则下标操作跟vector下标操作相同。

二、利用插入(insert)

map容器的insert成员。主要有以下几种形式:

m.insert(e);    e是一个用在m上的value_type类型的值,即pair类型。如果(e.first)不在m中,则插入值为e.second的新元素;如果该键在m中已存在,                                 则保持m不变。 并且该函数返回一个pair类型对象,包含指向e.first的元素的map的迭代器和一个bool类型的对象,表示是否插入了该元素。

m.insert(beg,end);   beg和end是标记元素范围的迭代器,其中的元素必须为m.value_type类型的键-值对。

m.insert(iter,e);   e是一个用在m上的value_type类型的值,如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返                                    回一个迭代器,指向m中具有给定键的元素。

例如:map<string,int>eords;

string word;

while(cin>>word)

{pair<map<string,int>::iterator,bool> it=words.insert(make_pair(word,1));

if(!it.second)++it.first->second;}

4.查找并且读取map中元素

m.count(k) 返回m中k出现的次数(这个k就是键)

m.find(k)  如果m容器中存在按k索引的元素,则返回指向钙元素的迭代器,如果不存在,则返回超出末端迭代器

5.map对象中删除元素:与插入操作类似

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

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

m.erase(b,e);  从m中删除一段范围内的元素,该范围有迭代器对b和e标记。b和e必须标记m中的一段有效范围。返回类型为void

原文地址:https://www.cnblogs.com/ljy2013/p/3306538.html