笔记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++学习笔记--关联容器

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

关联容器的细节以及使用要点

和顺序容器不同,关联容器是通过键值对的方式存储数据的,可以通过键来读取数据。C++中主要的关联容器是map和set两种,它们都只能为一个键添加一个值,如果希望添加多个值,应该使用multimap和mu...
  • qq_25722767
  • qq_25722767
  • 2016年08月25日 11:46
  • 381

顺序容器和关联容器的比较

1、关于什么是容器,以及容器的分类,下面这两篇博客讲得比较清楚,可以参考一下: (1) C++顺序性容器、关联性容器与容器适配器 (2) C++容器:顺序容器,关联容器 2、关于顺序容器和关联容器...
  • JIEJINQUANIL
  • JIEJINQUANIL
  • 2016年04月17日 21:55
  • 1511

c++关联容器总结

关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。 关联容器支持高效的关键字查找与访问。两个主要的关联容...
  • fengxinlinux
  • fengxinlinux
  • 2017年06月25日 16:49
  • 1634

STL之顺序容器和关联容器总结

顺序容器          Vector中所采用的数据结构非常简单:线性连续空间。当分配空间被占满而仍然需要添加元素时,vector便会进行一场空间重新配置的大工程!在这里,程序员需要注意的是,一旦...
  • lhc548453346
  • lhc548453346
  • 2016年03月07日 21:02
  • 885

C++关联容器 map用法

原创作品 转载请注明出处 http://blog.csdn.net/always2015/article/details/44980187关联容器关联容器和顺序容器有着根本的不同:关联容器中...
  • Always2015
  • Always2015
  • 2015年04月10日 15:21
  • 1431

c++ 关联容器

c++ 第十一章:关联容器 2:在c++中,顺序容器和关联容器之间本质的区别在于:关键字,关联容器中的元素是按照关键字来保存的,顺序容器中的元素是按照它们在容器中的位置来保存的。3:我们可以按照关键...
  • yangbodong22011
  • yangbodong22011
  • 2016年02月25日 19:10
  • 516

C++ Primer : 第十一章 : 关联容器之关联容器的迭代器和操作

关联容器的迭代器和操作
  • JY_95
  • JY_95
  • 2015年08月20日 10:38
  • 737

STL 顺序容器,关联容器

向量 vector :   是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。 在创建一个ve...
  • gavin0123
  • gavin0123
  • 2014年08月18日 15:12
  • 1156

[C++]高效使用关联容器的一些建议

关联容器 本文介绍在关联容器中常见的一些的问题以及提升使用关联容器的建议。 1. 理解相等(equality)和等价(equivalence)的区别。 相等是以operator==为基础的。等...
  • stary_yan
  • stary_yan
  • 2016年07月16日 17:57
  • 1311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:笔记4 (关联容器)
举报原因:
原因补充:

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