c++关联容器

1.关联容器介绍

关联容器中的元素是按关键字来保存和访问的。两个主要的关联容器类型是map和set。map中元素是关键字-值对。set中每个元素只包含一个关键字。允许重复关键字的容器为multimap和multiset。无序的在前面加上unorder_

2.使用关联容器

使用map://相当于  人名-电话号

map<string,size_t> word_count;

string word;

while(cin>>word)

++word_count[word];//提取word的计数器并将其加1.

使用set:相当于 人名

3.关联容器概述

支持普通容器的一般操作,但是不支持与位置相关的操作,比如push_back之类的

(1)multimap和multiset允许有多个元素具有相同的关键字。

(2)关键字类型的要求

有序容器的关键字类型

使用关键字类型的比较函数:

multiset<sales_data,decltype(compareisbn)*>    bookstore(compareisbn);//compareisbn是比较isbn的函数,返回布尔值。

当用deltype来获得一个函数指针类型时,必须加上一个*来指出我们要使用给定函数类型的指针。表示,向bookstore添加元素时,通过调用compareisbn来为这些元素排序。

(3)pair类型

定义在头文件utility中。一个pair保存两个(公有)数据成员。假设w是定义的pair,则访问两个数据成员分别通过w.first和w.second。

创建pair对象的函数:

pair<string,int>

process(vector<string> &v){
if(!v.empty())

return{v.back(),v.back().size()};

else

return pair<string,int>();}

(4)关联容器的操作

key_type 此为关键字类型

mapped_type 此为关键字关联的类型

value_type   对于set,和key_value相同。   对于map,为pair<const key_value,mapped_type>

a.关联容器迭代器

当解引用一个关联容器的迭代器时,我们会得到一个容器类型为value_type的值的引用。

map的value_type是一个pair,我们可以改变pair的值,但是不能改变其中关键字的值。set也是一样,关键字不能改变。

b.关联容器和算法

我们通常不对关联容器使用泛型算法。因为关键字是const,意味着只能只读。

c.添加元素

关联容器的insert成员添加或删除元素。由于map和set包含不重复的关键字,因此插入一个已经存在的关键字对容器没影响。

向map中添加元素:对map进行insert操作时,必须记住元素类型是pair。所以要在insert的参数列表中创建一个pair。

insert返回值依赖于容器类型和参数。

对于++((ret.first)->second);的理解:

ret 保存insert返回的值,是一个pair

ret.first是pair的第一个成员,是一个map迭代器,指向具有给定关键字的元素

ret.first->解引用此迭代器,提取map中的元素

d.删除元素

关联容器定义了三个版本的erase,除了一个迭代器和一个迭代器对。还提供了一个接受关键字类型key_value参数的erase。返回删除元素的数量。

e。map的下标操作

map <string,size_t>  word_count;//空map

word_count["ANNA"]=1;

程序执行步骤:首先找ANNA,没找到。然后将一个新关键字ANNA,值进行初始化为0。提取新插入的元素,将1赋予它。

对map进行下标操作时,返回mapped_type对象;当解引用map迭代器时,会得到一个value_type对象。

下标和at操作值适用于非const的map和unordered_map

f.访问元素

查找一个特定元素是否已在容器中,使用find,对于有重复关键字的,使用count。

如果使用下标操作查找元素,若关键字还未在map中,下表操作会插入关键字,造成副作用。

lower_bound(k)//返回一个迭代器,指向第一个关键字不小于k的元素

lower_bound(k)  //返回一个迭代器,指向第一个关键字大于k的元素

equal_range(k)  //返回一个迭代器pair,表示关键字等于k的范围,若k不存在,pair的两个成员均等于c.end();

4.无序容器

定义了4个无序关联容器,这些容器不是使用比较运算符来组织元素,而是使用一个哈希函数和关键字类型的==运算符。

无序的表现就是统计句子中单词数时不太可能按字典序输出。

无序容器在存储上组织为一组桶,对于不同关键字映射到相同的桶是允许的。管理桶的函数见p395.

无序容器使用==来比较元素,还使用一个hash<key_type>类型的对象来生成每个元素的哈希值

时间: 2024-12-28 12:28:14

c++关联容器的相关文章

STL 笔记(二) 关联容器 map、set、multimap 和 multimap

STL 关联容器简单介绍 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素. 在 STL 中,有四种关联容器,各自是: map 键值对 key-value 存储,key 不可反复,即一个 key 仅仅能相应一个 value, 相应头文件<map> multimap 键值对 key-value 存储,key 能够反复,即一个 key 能够相应多个 value, 相应头文件<map> set 仅仅有 key, key 不可反复,相应头文件<set>

实例讲解,set,multiset,map,multimap关联容器

测试环境:windows 7 vs2010 内部元素有序排列,新元素插入的位置取决于它的值,查找速度快. 除了各容器都有的函数外,还支持以下成员函数: find: 查找等于某个值的元素(x小于y和y小于x同时不成立即为相等) lower_bound: 查找某个下界 upper_bound: 查找某个上界 equal_range: 同时查找上界和下界 count:计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等) insert: 用以插入一个元素或一个区间 在学习关联容器之前,我们先

STL源码剖析---关联容器

标准关联容器分为set和map两大类,包括multiset和multimap,这些容器的底层机制都是RB-tree.标准之外的关联容器有hashtable 以及以此hash table为底层机制而完成的hash_set(散列集合) hash_map(散列映射表) hash_multiset  hash_multimap. 序列和关联容器各自的内部关系是内含的,例如heap内含一个vector,priority_quehe内含一个heap,stack和queue都内含一个deque,set/map

【足迹C++primer】38、关联容器操作(2)

关联容器操作(2) map的下标操作 map的下标操作 map和unordered_map容器提供了下标运算符合一个对应的at函数 对于一个map使用下标操作,其行为与数组或vector上的下标操作很不相同: 使用一个不再容器中的关键字作为下标,会添加一个此关键字的元素到map中 map和unordered_map的下标操作 c[k] 返回关键字为k的元素,如果关键字k不再c中,添加一个关键字为k的元素,对其进行值初始化 c.at(k) 访问关键字为k的元素,带参数检测,如果k不再c重那么返回一

关联容器(底层机制) — hashtable

C++ 11已将哈希表纳入了标准之列.hashtable是hash_set.hash_map.hash_multiset.hash_multimap的底层机制,即这四种容器中都包含一个hashtable. 解决碰撞问题的办法有许多,线性探测.二次探测.开链等等.SGI STL的hashtable采用的开链方法,每个hash table中的元素用vector承载,每个元素称为桶(bucket),一个桶指向一个存储了实际元素的链表(list),链表节点(node)结构如下: template <cl

STL_关联容器 VS C++ hashmap

红黑树和哈希表区别: http://m.blog.csdn.net/article/details?id=52133283 关于STL中关联容器的几个问题: (1)为何map和set的插入删除效率比用其他序列容器高? 大部分人说,很简单,因为对于关联容器来说,不需要做内存拷贝和内存移动.说对了,确实如此.set容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多,指向父节点和子节点.结构图可能如下: A   / \ B C / \ / \  D E F G 因此插入的时候只需要稍做变换,

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

关联容器 本文介绍在关联容器中常见的一些的问题以及提升使用关联容器的建议. 1. 理解相等(equality)和等价(equivalence)的区别. 相等是以operator==为基础的.等价是以operator<为基础的. 例如find的定义是相等,他用operator==来判断,这是比较容易理解的. 而等价关系是以"在已排序的区间中对象值的相对顺序"为基础的.也就是说,如果两个值中任何一个(按照既定的排列顺序)都在另一个的前面,那么他们就是等价的. !(w1 < w2

C++之容器(关联容器)

C++之容器(关联容器) 关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素.顺序容器通过元素在容器中的位置顺序存储和访问元素.因此,关联容器不提供front.push_front.pop_front.back.push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么. 两个基本的关联容器类型是map和set.map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据.set仅包含一个键,并有效

第11章 关联容器

map,管理数组,存储“关键字-值” set,简单集合,存储“关键字” 四个关联容器的头文件map.set.unordered_map.unordered_set 关联容器有8种,特点如下: 每个容器都是set或者map 分为允许关键字重复(multi)和不允许关键字重复 顺序保存和无序保存(unordered,哈希函数组织的结构) unordered_multiset是一个允许关键字重复,元素无序保存的集合 set是一个要求关键字不重复,元素有序保存的集合 map<string, size_t

C++拾遗(七)——关联容器

关联容器(Associative containers)支持通过键来高效地查找和读取元素.两个基本的关联容器类型是 map 和set.map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set仅包含一个键,并有效地支持关于某个键是否存在的查询.set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素.如果一个键必须对应多个实例,则需使用 multimap 或 multiset,这两种类型允许多个元