关闭

笔记4 (关联容器)

231人阅读 评论(0) 收藏 举报
分类:

关联容器

 

关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。

 

关联容器(associativecontainer)的元素按键排序和访问,支持通过键来高效地查找和读取元素。

 

map的元素以键—值(key-value)对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据。

set仅包含一个键,并有效地支持关于某个键是否存在的查询。

 

map

关联数组:元素通过键来存储和读取

set

大小可变的集合,支持通过键实现的快速读取

multimap

支持同一个键多次出现的 map 类型

multiset

支持同一个键多次出现的 set 类型

 

pair类型

#include<utility>

pair<T1, T2> p1;

创建一个空的 pair 对象,它的两个元素分别是 T1 和 T2 类型,采用值初始化

 pair<T1, T2> p1(v1, v2);

创建一个 pair 对象,它的两个元素分别是 T1 和 T2 ,其中 first 成员初始化为 v1,而 second 成员初始化为 v2

 

make_pair(v1, v2)

以 v1 和 v2 值创建一个新 pair 对象,其元素类型分别是 v1 和 v2 的类型

 

p1 < p2

两个 pair 对象之间的小于运算,其定义遵循字典次序:如果 p1.first < p2.first 或者 !(p2.first < p1.first) && p1.second < p2.second,则返回 true

 

p1 == p2

如果两个 pair 对象的 first 和 second 成员依次相等,则这两个对象相等。该运算使用其元素的 == 操作符

 

p.first

返回 p 中名为 first 的(公有)数据成员

 

p.second

返回 p 的名为 second 的(公有)数据成员

 

 

pair对象的操作

对于pair类,可以直接访问其数据成员:其成员者都是公有的,分别命名为first和second。

 

关联容器

根据键排列元素:在迭代遍历关联容器时,我们可确保按键的顺序访问元素,而与元素在容器中的存放位置完全无关。

 

map类型

关联本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。

 

map的定义

map<k, v> m;

创建一个名为 m 的空 map 对象,其键和值的类型分别为 k 和 v

map<k, v> m(m2);

创建 m2 的副本 m,m 与 m2 必须有相同的键类型和值类型

map<k, v> m(b, e);

创建 map 类型的对象 m,存储迭代器 b 和 e 标记的范围内所有元素的副本。元素的类型必须能转换为 pair<const k, v>

 

键类型的约束

键类型必须定义< 操作符,而且该操作符应能“正确地工作”。

 

map定义的类型

map<K, V>::key_type

在 map 容器中,用做索引的键的类型

map<K, V>::mapped_type

在 map 容器中,键所关联的值的类型

map<K, V>::value_type

一个 pair 类型,它的 first 元素具有 const map<K, V>::key_type 类型,而 second 元素则为 map<K, V>::mapped_type 类型

 

对迭代器进行解引用时,将获得一个引用,指向容器中一个value_type类型的值。

 

给map添加元素

 

使用下标访问map对象

 

下标操作符返回该键所关联的值(下标操作符返回的类型与迭代器的解引用返回类型不同,这点与vector和string类型不同)。

 

map::insert的使用

m.insert(e)

e 是一个用在 m 上的 value_type 类型的值。如果键(e.first)不在 m 中,则插入一个值为 e.second 的新元素;如果该键在 m 中已存在,则保持 m 不变。该函数返回一个 pair 类型对象,包含指向键为 e.first 的元素的 map 迭代器,以及一个 bool 类型的对象,表示是否插入了该元素

m.insert(beg, end)

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

m.insert(iter, e)

e 是一个用在 m 上的 value_type 类型的值。如果键(e.first)不在 m 中,则创建新元素,并以迭代器 iter 为起点搜索新元素存储的位置。返回一个迭代器,指向 m 中具有给定键的元素

查找并读取map中的元素

m.count(k)

返回 m 中 k 的出现次数

m.find(k)

如果 m 容器中存在按 k 索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器

count适合用于解决判断map容器中某键是否存在的问题,而find适合用于解决在map容器中查找指定键对应的元素的问题。

 

set类型

set容器只是单纯的键的集合。

#include<set>

 

multimap和multiset类型

multimap和multiset类型允许一个键对应多个实例。

在multimap中,同一个键所关联的元素必然相信存放。

m.lower_bound(k)

返回一个迭代器,指向键不小于 k 的第一个元素

m.upper_bound(k)

返回一个迭代器,指向键大于 k 的第一个元素

m.equal_range(k)

返回一个迭代器的 pair 对象

它的 first 成员等价于 m.lower_bound(k)。而 second 成员则等价于 m.upper_bound(k)

 


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4686次
    • 积分:140
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:7篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档