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"];
}