关联容器:map和multimap
1. 关联容器 multimap
1.1 multimap 模板类
template<class Key, class T, class Pred = less<Key>,class A = allocator<T> >
class multimap
{
....
typedef pair<const Key, T> value_type;
.......
}; //Key 代表关键字的类型
使用场景:
如果需要动态的添加数据,并且同时需要查询数据时,可以使用multimap
1.2 模板参数:
- Key:指定键的类型
- T:指定值的类型
- Pred: 指定键比大小的规则
- A
注意:
- multimap中的元素由 <关键字,值>组成,每个元素是一个pair对象,关键字 就是first成员变量,其类型是Key
- multimap 中允许多个元素的关键字相同。元素按照first成员变量从小到大 排列,缺省情况下用 less 定义关键字的“小于”关系
- 在类内部,将存放的pair类 typedef:typedef pair<const Key, T> value_type;
- 如果比大小的规则是缺省的,那么采用默认的规则比较。
1.3 multimap 支持的操作
1.3.1 插入
// 定义一个map对象
typedef map<int, string> STU;
STU mapStudent;
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
// 第二种 用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "student_one"));
//第三种 采用make_pair()
mapStudent.insert(make_pair(001, "student_one"));
1.3.2 查找元素
当所查找的关键key出现时,它返回数据所在对象的位置,如果沒有,返回iter与end函数的值相同。
// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapStudent.find("123");
if(iter != mapStudent.end())
cout<<"Find, the value is"<<iter->second<<endl;
else
cout<<"Do not Find"<<endl;
1.3.3 刪除与清空元素
//迭代器刪除
iter = mapStudent.find("123");
mapStudent.erase(iter);
//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0
//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//清空元素
mapStudent.clear()
1.3.4 查询map大小
在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:
int nSize = mapStudent.size();
1.3.5 multimap 支持的其他操作
insert() //插入元素
erase() //删除一个元素
clear() //删除所有元素
count() //返回指定元素出现的次数
find() //查找一个元素
size() //返回map中元素的个数
begin() //返回指向map头部的迭代器
end() //返回指向map末尾的迭代器
rbegin() //返回一个指向map尾部的逆向迭代器
rend() //返回一个指向map头部的逆向迭代器
empty() //如果map为空则返回true
equal_range() //返回特殊条目的迭代器对
get_allocator() //返回map的配置器
key_comp() //返回比较元素key的函数
lower_bound() //返回键值>=给定元素的第一个位置
upper_bound() //返回键值>给定元素的第一个位置
max_size() //返回可以容纳的最大元素个数
swap() //交换两个map
value_comp() //返回比较元素value的函数
1.3.6 map 举栗子
// 简单使用 multimap
#include <iostream>
#include <map>
using namespace std;
int main()
{
typedef multimap<int,double,less<int> > mmid;
mmid pairs;
cout << "1) " << pairs.count(15) << endl;
pairs.insert(mmid::value_type(15,2.7));//typedef pair<const Key, T> value_type;
pairs.insert(mmid::value_type(15,99.3));
cout << “2) ” << pairs.count(15) << endl; //求关键字等于某值的元素个数
pairs.insert(mmid::value_type(30,111.11));
pairs.insert(mmid::value_type(10,22.22));
pairs.insert(mmid::value_type(25,33.333));
pairs.insert(mmid::value_type(20,9.3));
for( mmid::const_iterator i = pairs.begin();
i != pairs.end() ;i ++ )
cout << "(" << i->first << "," << i->second << ")" << ",";
}
2. map
- map 与multimap 的不同之处在于map 不允许有重复的键。
- 另外map 支持类似于数据的插入操作、或者查询操作(通过[] 成员函数)
若pairs为map模版类的对象,pairs[key]:
返回对关键字等于key的元素的值(second成员变量)的引用。若没有关键
字为key的元素,则会往pairs里插入一个关键字为key的元素,其值用无参
构造函数初始化,并返回其值的引用。