关联容器: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的元素,其值用无参
构造函数初始化,并返回其值的引用。

posted @ 2019-12-17 17:06  江南又一春  阅读(156)  评论(0编辑  收藏  举报