关联容器——(map/multimap)

1、map的特性

map的特性是所有元素都会根据元素的键值自动被排序,map的所有元素都是一对的(pair),同时拥有实值(value)和键值(key)。pair中的第一个元素被看作键值,第二个元素被看做实值,且map不允许两个元素拥有相同的键值。

map和list拥有相同的某些性质,当它对容器元素进行添加或删除时,操作之前的所有迭代器在操作完成值后依然有效。

2、map的初始化

map<key,value>arr; //创建一个名为arr的空的map,其键值和实值为key和value

map<key,value>arr(arr2); //创建arr2的副本arr,arr和arr2必须有相同的键类型和值类型

map<key,value>arr(a,b); //创建map类型的对象arr,存储迭代器a和b标记的范围内所有元素的副本,元素的类型必须能转换为pair

map<key,value,comp>arr; //comp可选,为键值对的存放策略,即键的比较函数,默认标准库使用键类型定义的<操作符来实现键的比较。所用的比较函数必须在键类型上定义严格的弱排序,可将其理解为键类型数据上的“小于关系”。在实际应用中,键类型必须能定义<操作符。对于键,其唯一的约束就是必须支持<操作符。

3、map的相关操作

1.插入

arr.insert(e);

e是一个用在arr上的value类型的值。如果e.first不在arr中,则,插入一个值为e.second的新元素;如果该键在arr中已存在,那么不进行任何操作。该函数返回一个pair类型对象,包含指向键为e.first的元素map的迭代器,以及一个bool类型的对象,表示是否插入了该元素。

arr.insert(beg,end);

beg,end是标记元素范围的迭代器,对于该范围内的所有元素,如果它的键在arr中不存在,则将该键及其关联的值插入到arr。返回void类型。

arr.insert(iter,e);

e是value类型的值,如果e.first不在arr中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置,返回下一个迭代器,指向arr中具有给定键的元素。在添加新的map元素时,使用insert成员可避免使用下标操作符带来的副作用,即不必要的初始化。

插入元素的方式有三种:

通过pair的方式插入对象

arr.insert(pair<int,string>(3,"小张"));或arr.insert(make_pair(-1,"小王"));

通过value_type的方式插入对象

arr.insert(map<int,string>::value_type(1,"小李"));

通过数组的方式插入

arr[4]="小刘";

2.删除

arr.clear(); //删除所有元素

arr.erase(pos); //删除pos所指的元素,返回下一个元素的迭代器

arr.erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器

arr.erase(keyelem); //删除容器中key为keyelem的组对

3.查找

arr.find(key); //查找键值key是否存在,存在返回该键的元素的迭代器,不存在返回map.end()

arr.count(keyelem); //返回容器中key为keyelem的对组的个数,对于map来说要么是0要么是1

arr.lower_bound(keyelem); //返回第一个key>=keyelem元素的迭代器

arr.upper_bound(keyelem); //返回第一个key>keyelem元素的迭代器

arr.equql_range(keyelem); //返回容器中key与keyelem相等的上下限的两个迭代器

4、map简单的实现

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
	map<string,int>arr;
	arr.insert(pair<string,int>("xiaozhang",1));
	arr.insert(pair<string,int>("xiaowang",2));
	arr[string("xiaoliu")]=3;
	arr[string("xiaohu")]=4;
	pair<string,int>value(string("xiaolei"),5);
	arr.insert(value);
	map<string,int>::iterator iter1=arr.begin();
	for(;iter1!=arr.end();++iter1)
		cout<<iter1->first<<' '<<iter1->second<<endl;
	int num=arr[string("xiaowang")];
	cout<<num<<endl;
	map<string,int>::iterator iter2;
	iter2=arr.find(string("xiaolei"));
	if(iter2==arr.end())
		cout<<"Not found!"<<endl;
	else
		cout<<"Is found!"<<endl;
	iter2->second=7; //修改了value值
	int num2=arr[string("xiaolei")];
	cout<<num2<<endl;
	iter2=arr.find(string("gkjjksj"));
	if(iter2==arr.end())
		cout<<"Not found!"<<endl;
	else
		cout<<"Is found!"<<endl;
}

5、multimap

multimap的特性以及用法与map完全相同,唯一的差别在于,multimap允许键值重复。

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
	multimap<string,int>arr;
	arr.insert(pair<string,int>("xiaozhang",1));
	arr.insert(pair<string,int>("xiaowang",2));
	arr.insert(pair<string,int>("xiaozhang",6));
	pair<string,int>value(string("xiaolei"),5);
	arr.insert(value);
	multimap<string,int>::iterator iter1;
	iter1=arr.lower_bound("xiaozhang");
	cout<<iter1->first<<" "<<iter1->second<<endl;
	multimap<string,int>::iterator iter2;
	iter2=arr.upper_bound("xiaowang");
	cout<<iter2->first<<" "<<iter2->second<<endl;
	int num=arr.count("xiaozhang");
	cout<<num<<endl;
	multimap<string,int>::iterator itbeg=arr.begin();
	multimap<string,int>::iterator itend=arr.end();
	arr.erase(itbeg,itend);
	if(arr.empty())
	{
		cout<<"arr已空"<<endl;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值