STL2——关联容器

关联容器

关联容器支持通过键(key)来高效地查找和读取元素。两个基本的关联容器是map和set,map的元素以键-值对形式组织,键用做索引,值表示存储和读取的数据,set包含一个键,并有效地支持关于某个键是否存在的查询。

引言:pair类型

#include<utility>
pair<int,int>p;
p.first=5;
p.second=6;

pair<int,int>p2;
p2=make_pair(5,7);

pair<int,int>p3(9,10);

map

map是键值对的集合,可使用键作为下标来获取一个值。键类型必须支持<操作符,而且能正确的工作。

map对象的定义

map定义的类型

对map迭代器进行解引用将产生pair类型对象,它的first成员存放键为const,second成员存放值。

map添加成员

使用下标访问map对象

使用下标(键)访问时,如果下标存在,则返回下标所关联的值,如果下标不存在,则map容器为该键创建一个新元素,并将它插入到map对象中。

//统计输入的每个单词出现的次数
map<string,int>word_count;
string word;
while(cin>>word)
	++word_count[word];

insert使用

m.insert(e)

e为一个m上的value_type类型,如果键不存在,则插入值到map中,如果键存在(map中一个给定的键只对应一个元素),则不做任何操作。函数返回一个pair对象,指向键为e.first(即插入元素)的元素的map迭代器,以及一个bool类型对象,表示是否插入了该元素。

word_count.insert(map<string,int>::value_type("Anna",50));
word_count.insert(make_pair("Lily",100));//可以用make_pair简化

typedef map<string,int>::value_type valtype;//用typedef简化
word_count.insert(valtype("Anna",50));

m.insert(beg,end)

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

m.insert(iter,e)

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

查找并读取map中元素

map中删除对象

map对象的遍历

map也提供begin和end运算以生成用于遍历整个容器的迭代器。

set

set只是单纯的键的集合,除了不支持下标操作符,以及没有定义mapped_type类型外,可支持map定义的大部分操作,包括map的构造函数,insert操作,count和find,erase操作。和map一样,set容器存储的键也必须是唯一的,而且不能修改。

multimap和mutiset

multimap和mutiset允许一个键对应多个实例,并且与set和map包含在相同的头文件中。

带有一个键参数的erase版本将删除拥有该键的所有元素,并返回删除的个数,而带有一个或一对迭代器参数的版本只删除指定的元素,并返回void。

因为键值相同的值存储在相邻的位置,所以可以有以下方法遍历:

1.用count求出某键出现的次数,然后用find操作返回一个迭代器,依次查找;

2.可以使用返回迭代器的关联容器操作

在同一个键上调用头两个函数将产生一个迭代器范围,指示出该键所关联的所有元素。lower_bound返回的迭代器指向该键关联的第一个实例,upper_bound返回的迭代器则指向最后一个实例的下一个位置。如果该键不在容器中,这两个操作返回同一个迭代器,指向依据元素的排列顺序该键应该插入的位置或者指向容器超出末端的位置。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-25 21:27:33

STL2——关联容器的相关文章

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