关联式容器:map和multimap 及unordered_map

map和multimap 及unordered_map

  • 每个元素都是pair
  • pair的第一个元素为key(键值) 起索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序
  • 优点:可以根据key值迅速找到value值

map键是唯一的,每个键都对应一个值;

mulltmap允许容器中有多个重复的key值。

使用二者时需引入头文件#include<map>. 

map的迭代器为双向访问,不支持随机访问,执行一次++或--的时间复杂度为O(logn).

  • size()/empty()/clear()          元素个数、判空、清空
  • begin()/end()                      开始位置和结束位置
  • rbegin()                            最后一个元素的位置
  • 四种插入方式,见下
  • erase(key)                         删除所有键为key的元素
  • erase(it)                         删除it迭代器指向的元素,返回下一个元素的迭代器
  • erase(deg,end)             删除区间[beg,end)的元素,返回下一个元素的迭代器
  • find(key)                         查找键key是否存在,若存在则返回迭代器,若不存在,返回m.end()
  • count(key)                      统计key的元素个数
  • swap(st)                          交换

构造、赋值、

map<string,int>a;                      //升序
map<string,int,greater<string> >b;     //降序


a.insert(make_pair(s,i));            //可以使用make_pair生成一对数(键,值)进行插入

for(mao<string,int>::iterator it=a.begin();it!=a.end();it++)
    cout<<it->first<<"  "<<(*it).second<<endl;

map<string,int>c(a);                 //拷贝构造函数
map<string,int>d;
d=c;                                 //赋值方式构造

可以通过[]直接对键所对应的值进行操作:
cout<<a[s]<<endl;          //输出键为s(string类型)对应的值(int类型)
a[s]=5;

需要注意,如果查找的key不存在,则指向a[key]之后会自动新建一个二元组(key,0)并返回0,因此可能会建立很多无用的二元组,最好在a[key]之前先判断a.find(key)!=a.end()。

#include<iostream>
#include<map>
#include<string>
using namespace std;
class Person
{
public:
	Person(string a,int b)
	{
		name=a;
		age=b;
	}
	string name;
	int age;
};
class Myclass
{
public:
	bool operator()(const Person& a,const Person& b)
	{
		return a.age>b.age;
	}
};



void print(const map<string,int>&s)//防止误改 
{
	for(map<string,int>::const_iterator it=s.begin();it!=s.end();it++)
	{
		cout<<it->first<<"   "<<(*it).second<<endl;
	}
	cout<<endl<<endl;
}


int main()
{
	map<string,int>m;
	m.insert(pair<string,int>("张九九",20));
	m.insert(make_pair("樊乂乂",17));
	m.insert(map<string,int>::value_type("zx",19));
	m["fmx"]=16;
	cout<<m["123"]<<endl;//不建议用这种方法,因为如果没有这个pair,会新建一个 
	print(m);
	
	m.erase(m.begin());
	print(m);
	m.erase("zx");
	print(m);
	return 0;
}

如果是自定义的数据类型,则需要写仿函数,详情见set那一节

 

multimap因为是一对多的关系,不能用[]

multimap<string,int> mp;
string s1("X"),s2("Y");
mp.insert(make_pair(s1,50));
mp.insert(make_pair(s1,55));
mp.insert(make_pair(s1,60));
mp.insert(make_pair(s2,30));
mp.insert(make_pair(s2,20));
mp.insert(make_pair(s1,10));

multimap<string,int>::iterator it;
it=mp.find(s1);
for(int k=0;k<mp.count(s1);k++,it++)
    cout<<it->first<<"  "<<it->second<<endl;

输出如下:
X  50
X  55
X  60
X  10

 

map: map内部实现了一个红黑树,该结构具备自动排序的功能,所以map内部的全部元素都是有序的,红黑树的每个节点都表明着map的一个元素,所以,对于map进行的查找,删除,添加等一系列的操做都至关因而对红黑树进行这样的操做,故红黑树的效率决定了map的效率。


unordered_map: unordered_map内部实现了一个哈希表,所以其元素的排列顺序是杂乱的,无序的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值