c++之STL之pair,map

pair类型:下面是这个类型的一些操作:

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

pair<T1,T2> p1(v1,v2);创建一个pair类型,它的二个元素分别是T1,T2类型,其中first成员初始化为v1,seconde初始化为v2;

make_pair(v1,v2) 以p1和p2创建一个新的pair类型,元素类型分别是v1和v2类型

p1<p2 二个pair类型之间的小于运算,遵循的是字典次序,如果p1.first<p2.first。

p.first;返回p中的first数据成员;

p.second 返回second数据成员

比如创建一个pair对象:

pair<string,string> au("sssd","sdfsa");

pair类型的使用相当繁琐,如果需要定义多个相同的pair类型时,可以考虑用typedef简化声明;

typedef pair<string,string> A;

A p1("sdsf","sdf");

A p2("asdf","sadf");

还可以使用make_pair();

例如:

pair<string,string> next;

string first,seconde;

while(cin>>first>>seconde)

{

next=make_pair(first,seconde);

}

map类型:

要使用map类型对象时,必须包含map的头文件。

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

map<K,V> m(m2);创建m2的副本m,

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

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中的整个一个元素的类型,这个中的键的值是不能修改的,而值是可以修改的。

1.map迭代器在解引用是将产生pair类型的对象.

2.给map中添加元素:

这儿添加元素时可以使用二中方法,第一种是使用下标,第二种是insert函数。

但是在使用下标时与vector完全不同的是,用下标访问不存在的元素时将导致map容器中的添加额一个新元素,它的键极为该下标值。而将值就进行了初始化,这样的话,就会导致起初是想访问,但是却添加了一个不存在的元素。

看下例:

map<string,int> word_count;

string word;

while(cin>>word)

{

++word_count[word];

}

这段程序就是创建一个map对象,用来记录每个单词出现的次数,while循环读入一个单词,则作为键值,起初,不存在,所以,map中就新建了一个键,而这个值为int型,起初是初始化为0,但是,有++了,所以变为了1,这个就是当map中不存在是,我们用下标访问时,出现的情况,当下次有遇到这样的元素,则存在了这个键,将她所对应的值再加1。

map::insert的使用:

插入单个元素时,insert实用的是pair类型的参数,:

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

m.insert(beg,end)插入beg和end迭代器之间的pair类型的键值对,返回void

下例是一个和上面的下标例子同功能的单词记数的程序:

map<string ,int > word_count;

string word;

while(cin>>word)

{

pair<map<string,int>::iterator,bool> ret=word_count.insert(make_pair(word,1));//这个insert函数返回的是map的迭代器和bool的pair类型,bool就是看有没插入成功。

if(!ret.second)//没有插入成功的话。

{

++ret.first->second;//ret.first就是返回的map的迭代器类型,这个迭代器是指向刚要插入的map,有->second就是这个map值的int类型,如果是重复了,在在原来的基础上再加1.

}

}

3.查找并读取map中的元素:

m.count(k);//返回m中k出现的次数;

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

实例:

读取元素又不插入该元素:

int occurt=0;

map<string,int>::iterator it=word_count.find("sss");

if(it!=word_count.end())

{

occur=it->second;

}

实例:

使用count检查map对象中键是否存在:

int occur=0;

if(word_count.count("sss"))

{

occurt=word_count["sss"];

}

猜你喜欢

转载自blog.csdn.net/daydayup_666/article/details/78160724