笔记4 (关联容器)

原创 2013年12月02日 19:20:55

关联容器

 

关联容器和顺序容器的本质差别在于:关联容器通过键(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)

 


C++primer学习:关联容器练习(4)

单词转换程序:将一个文本中的单词按照另一个文本的转换规则,替换成另外一个文本中的单词.并且开头字母大写;#include "iostream" #include "vector" #include ...

Part3:关联容器(二)&Part4:迭代器

Rule4:当关乎效率时应该在map::operator[]和map-insert之间仔细选择 map[key] = value;这是一种简要的写法,这个操作是,如果key值不存在,插入这样一个键值对...
  • cshilin
  • cshilin
  • 2016年07月16日 16:13
  • 3982

《c++ primer》 第11章 关联容器 学习笔记

关联容器支持高效的查找和访问,它和其他容器类型不同,是通过键值来访问元素的, 两个主要的关联容器是map和set,map中的元素是键->值对应,set中的元素光是键。 按关键字有序保存元素 map  ...

c++ primer(第五版)学习笔记及习题答案代码版(第十一章)关联容器

笔记较为零散,都是自己不熟悉的知识点。 习题答案至于一个.cc 中,包含Chapter7.h头文件,读入文件包括./test ./rules .需要演示某一题直接修改 #define NUM****...
  • refuil
  • refuil
  • 2016年05月24日 16:31
  • 3685

C++学习笔记--关联容器

C++标准库提供8个关联容器:map、multimap、unordered_map、unordered_multimap、set、multiset、unordered_set、unordered_mu...
  • du_qi
  • du_qi
  • 2016年08月15日 17:42
  • 495

C++学习笔记-关联容器

关联容器的类型 是map还是set,关键字可不可以重复,是顺序保存元素,还是无序保存元素,组合出来8种关联容器。 map类型是元素是关键字和值对,set是关键字的简单集合 关联容器不支持顺序...
  • jo_lan
  • jo_lan
  • 2015年12月23日 16:17
  • 437

C++ STL关联容器 set和map学习笔记

C++ STL关联容器 set和map学习笔记 STL提供了4种关联容器:set、multiset、map和multimap。前两种在头文件#include,后两种在头文件#include中定义的。 ...

c++Primer笔记(十 关联容器)

第十章:关联容器。set map multimap  multiset   键是只读的,试图修改只有出错的份 1.关联容器和顺序容器的本质差别在于:关联容器通过key键存储和读取元素,而顺序容器则通...

C++学习笔记22——关联容器之map

1,关联容器综述 关联容器和顺序容器的本质区别在于: 关联容器通过键(key)来存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。 可能正是因为其不是通过位置来存储的,所以关联...

effective STL 读书笔记——第三章:关联容器

条款19:了解相等和等价的区别相等:一般表示operator==操作符返回true 等价:一般用于关联容器,表示两个对象x和y如果在关联容器c的排序顺序中没有哪个排在另一个之前,一般以Operato...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:笔记4 (关联容器)
举报原因:
原因补充:

(最多只允许输入30个字)