关联容器(map,set等)

一、引言

1、关联容器中的元素是按关键字来保存和访问的。关联容器支持高效的关键字查找和访问。
2、两个主要的关联容器类型是mapset。map中的元素是一些关键字–值对,关键字起到索引的作用,值表示与索引相关联的数据。set中的每个元素只包含一个关键字
3、map和multimap定义在头文件中map中。
set和multiset定义在头文件set中。
4、map与multimap的区别:map的关键字不允许出现重复,multimap关键字可以重复出现,即使关键字相同,值不同。set与multiset与之相同。
5,、关联容器类型:

按关键字有序保存元素
map关联数组;保存关键字–值对
set关键字即值,只保存关键字的容器
multimap关键字可重复出现的map
multiset关键字课重复出现的set
无序集合
unordered_map用哈希函数组织的map
unordered_set用哈希函数组织的set
unordered_multimap哈希组织的,关键字可以重复
unordered_multiset哈希组织的,关键字可以重复

*无序与有序的区别:是否按顺序保存元素。(根据关键字排序)

二、关联容器概述

定义一个map时,必须指明关键字类型又指明值类型。定义set时,只需指明关键字类型。

1、定义关联容器(以map为例)

map<string,int>word_count   //空容器
map<string,string> authors={ {"张","三"},{"王","五"}} //初始化

{key,value},关键字是第一个元素,值是第二个元素。定义时也是如此,map<key类型,value类型>。

2、关键字类型的要求

2.1、默认情况下,标准库使用关键字类型的<运算符来比较关键字。在集合类型中,关键字类型就是元素类型;在映射类型中,关键字类型是元素的第一部分的类型。
2.2、有序容器中定义的关键字类型,必须可以比较,如果没有,那必须自己写比较函数,使这种类型可以进行比较。

multiset<Sales_data,decltype(compareIsbn)*>bookstore;

compareIsbn是自己写的比较函数。

3、pair类型

3.1、pair定义在头文件utility中。
3.2、一个pair保存2个数据成员,类似容器它的数据成员是public2个成员分别是first行业second
3.3、

pair<T1,T2> p;默认初始化
pair<T1,T2> p{v1,v2};first用v1初始化,second用v2初始化
pair<T1,T2>p={v1,v2};等价于p{v1,v2}
make_pair(v1,v2)返回一个用v1和v2初始化的pair。pair类型从v1,v2的类型推断出
p.first返回p的名为first的数据成员
p.second返回p的名为second的数据成员
p1==p2当first和second分别相等时,两个pair相等
//未实现初始化
pair<string,string>anon;
pair<string,vector<int>>line;

//实现初始化
pair<string,string>anon1{"王","五"};

4、额外的类型别名

key_type此容器类型的关键字类型
mapped_type每个关键字关联的类型;只适用于map
value_type对于set,与key_type相同,对于map,为pair<const key_type,mapped_type>
map<string,int>::value_type v3;  //v3是一个pair<const string,int>
map<string,int>::key_type v4;  //v4是一个string
map<string,int>::mapped_type v5  //v5是一个int

5、关联容器的迭代器

map和set类型都支持begin和end操作。可以通过迭代器遍历容器。

auto map_it=word_count.begin();
while(map_it!=word_count.end())
{
cout<<map_it->second;
++map_it;
}

三、关联容器操作

只有当元素的关键字不在c中时才插入。

1、添加元素

c.insert(v)在c里面插入v
c.insert(b,e)b和e是迭代器,表示范围
c.insert(il)il是元素列表
c.insert(p,v)p是迭代器,表示在p处插入
c.emplace(args)用args替换c元素
c.emplace(p,args)替换p处的元素

insert返回pair类型,first指向具有给定关键字的元素,second是一个bool值,表示是否插入成功。

2、删除元素

c.erase(k)从c中删除每个关键字为k的元素,返回删除元素的数量
c.erase(v)从c中删除迭代器v指定的元素
c.erase(b,e)删除迭代器b和e所表示范围中的元素。返回e

3、下标操作

3.1、set不支持下标操作。
3.2、使用一个不在容器中的关键字作为下标,会添加一个具有此关键字的元素到map中。

map<string,int> word_count;
word_count["张"]=1;
c[k]返回关键字为k的元素,若没有,则添加一个关键字为k的元素
c.at(k)访问关键字为k的元素,带参数检查,若没有则抛异常

下标操作的返回值是一个左值,跟数组操作一样。

4、访问元素

c.find(k)返回迭代器,指向第一个关键字为k的元素。若不在c中,返回尾后迭代器
c.count(k)返回关键字等于k的元素数目
c.lower_bound(k)返回一个迭代器,指向第一个关键字不下于k的元素
c.upper_bound(k)返回一个迭代器,指向第一个关键字大于k的元素
c.equal_range(k)返回迭代器pair,表示关键字等于k的元素范围
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值