multimap联合容器范例
与set相似,multimap也是可反转的、经过排序的联合容器,不同之处在于,关键字的类型与值类型不同,特定的关键字可能与多个值相关联。
基本的multimap声明使用模板参数指定了关键字的类型和所存储的值的类型。
例如,下面的声明将创建一个multimap对象,其中的关键字的类型为int,所存储的值的类型为string :
multimap<int,string> codes;
可选的第三个模板参数可用于指出用于对关键字进行排序的比较函数或对象。默认使用less<>模板,该模板将关键字类型作为参数。
为将信息结合在一起,实际的值类型将关键字类型和数据类型结合为一对。STL使用pair<class T, class U>模板类将这两种值存储到一个对象中。
如果keytype是关键字类型,而datatype是被存储的数据类型,则值类型为pair<const keytype, datatype> 。
例如,假设要用区号作为关键字来存储城市名。一种方法是创建一个pair,然后将它插入:
pari<const int, string> item (213, "Los Angeles");
codes.insert (item);
也可以使用一条语句创建一个匿名pair对象,并将它插入:
codes.insert (pair<const int,string>(213,"Los Angeles") );
因为数据项是按关键字排序的,所以不需要指出插入位置。
可以使用first和second成员来访问pair对象的两个部分:
pari<const int, string> item (213, "Los Angeles");
cout << item.first << ' ' << item.second << endl;
count()成员函数用关键字作为参数,并返回具有该关键字的元素的数目。
lower_bound()方法将关键字作为参数并返回一个迭代器,该迭代器指向集合中第一个不小于关键字参数的成员。
upper_bound()方法将关键字作为参数并返回一个迭代器,该迭代器指向集合中第一个大于关键字参数的成员。
equal_range()成员函数用关键字作为参数,并返回表示与该关键字匹配的区间的迭代器。为返回两个值,该方法将这两个值封装在一个pair对象中,此时两个模板参数都是迭代器类型。
例如,下面的代码打印codes对象中区号为718的所有城市:
typedef int KeyType;
pair<multimap<KeyType, string>::iterator,
multimap<KeyType, string>::iterator> range = codes.equal_range(718);
cout << "Cities with area code 718: /n";
multimap<KeyType, string>::iterator it;
for (it = range.first; it != range.second; ++it)
cout << (*it).second <<endl;
map类可以用数组表示法(将关键字用作索引)来访问所存储的值。
例如,codes[213]表示与关键字213相关联的值"Los Angeles"。
如果关键字是字符串,则要使用codes["关键字"]这样的表示法。
或者使用对指向关键字的指针(假设为pc)解除引用的方式,codes[*pc]。
如果关键字不存在,则该类会自动添加该关键字,和与其相关联的值。
例如,codes[*pc] = "china"。如果*pc不存在,将自动添加*pc所指向的值和"china"到容器中,并关联起来。
如果只提供关键字,而不提供值,则值将为0 。
例如,codes[*pc] 如果*pc不存在,将自动添加*pc所指向的值和 0 到容器中,并关联起来。