当前位置: 首页 > 资讯 > >正文

C++ 关联容器操作_焦点日报

来源:哔哩哔哩    时间:2023-05-08 02:08:32

除了表9.2中列出的类型,关联容器还定义了一些额外类型。

对于set类型,key_type和value_type是一样的;set中保存的就是关键字。在一个map中,元素就是关键字-值对。由于我们不能改变一个元素的关键字,因此这些pair的关键字部分是const的

只有map类型可以使用mapped_type


(资料图片仅供参考)

关联容器迭代器

当解引用一个关联容器迭代器时,我们会得到一个类型为容器的value_type的值的引用。对map而言,value_type是一个pair类型,器first成员保存const的关键字,second成员保存值

set的迭代器是const的

虽然set类型同时定义了iterator和const_iterator类型,但两种类型都只允许只读访问set中的元素。与不能改变一个map元素的关键字一样,一个set中的关键字也是const的。可以用一个set迭代器来读取元素的值,但不能修改

遍历关联容器

map和set类型都支持表9.2中的begin和end操作

使用上面代码读取word_count中的元素值。

本程序的输出是按字典序排列的。当使用一个迭代器遍历一个map、multimap、set、multiset时,迭代器按关键字升序遍历元素。

关联容器和算法

我们通常不会对关联容器使用泛型算法,因为关键字是const属性,意味着不能修改和重新排序元素。

关联容器可以使用只读元素的算法。如果关联容器有专用的函数一般不要使用泛型算法。例如find。

如果实在要使用算法,那么我们要么把他当作源序列,要么当作一个目的位置。例如可以使用泛型的copy;或者可以调用inserter将一个插入器绑定到一个关联容器,将关联容器当作一个目的位置来调用另一个算法。

添加元素

关联容器insert成员向容器中添加一个元素或一个元素范围,由于map和set(以及对应的无序类型)包含不重复的关键字,因此插入已经存在的元素对容器没有任何影响

对于一个给定的关键字,只有第一个带此关键字的元素才被插入到容器中。

向map添加元素

对map进行insert操作时必须插入pair。

上面是四种insert

检测insert的返回值

insert(或emplace)返回的值依赖于容器类型和参数。对于不包含重复关键字的容器,添加单一元素的insert和emplace版本返回一个pair,告诉我们插入是否成功。pair的first成员是一个迭代器,指向具有给定关键字的元素,second成员是一个bool值,指出元素插入成功(true)还是已经存在于容器(false)

如果map中已经含有word,那么insert什么也不会做,这时我们用一个if将出现次数+1

向multimap或multiset添加元素

如果我们希望相同的关键字可以含有不同的值,那么我们可以使用multimap而不是map

第二条插入是有效的。

这时insert操作返回一个指向新元素的迭代器,并且不会返回一个bool值,因为他总是成功。

删除元素

关联容器定义了三个版本的erase

相对于普通容器,关联容器有一个额外的erase,他接受一个key_type参数,此版本删除搜娱哦匹配给定关键字的元素(如果存在的话),返回实际删除的元素的数量。

对于保存不重复关键字的容器,erase的返回值总是0(不在容器中)或1

对于允许重复关键字的容器,删除元素可能大于1

map的下标操作

map和unordered_map容器提供了下标运算符和一个对应的at函数,set类型不支持下标,因为set中没有与关键字相关联的“值”,所以下标的操作是没有意义的,我们不能对multimap或者unordered_multimap进行下标操作,因为这些容器中可能有多个值和一个关键字关联。

map下标运算符接受一个关键字索引,和其他下标运算符不同的是,如果关键字不在容器中,会为他创建一个元素并插入到map,关联值将进行值初始化

我们没有找到S-a-i的元素,word_count自动创建一个const string的关键字为“S-a-i”,并初始化为0,然后再将1赋给"S-a-i"。

使用下标操作的返回值

map的下标运算符和我们使用过的其他下标运算符不同之处是返回类型,通常解引用一个迭代器所返回的类型与下标运算符返回的类型是一样的,但是map不同,对一个map进行下标操作时,会获得一个mapped_type对象,但解引用map会得到一个value_type对象

map下标运算符返回一个左值,我们既可以读也可以写

访问元素

在解决一个问题时我们最好根据问题使用不同的方法

如果我们只想查找一个元素是否在map中,而不想改变他,那我们就不能使用下标运算符,我们就要使用find,因为下标运算符在查找元素不在map中时添加他。

在multimap或者multiset中查找元素

如果容器中的元素可以重复那么查找就比较复杂了,在这种容器中,有多个元素具有给定关键字,这些元素就会相邻存储。

一种不同的面向迭代器的解决办法

我们还可以使用lower_bound和upper_bound来解决

这两个函数是利用二分法来查找的(这里不过多描述),lower_bound返回的迭代器将指向第一个具有给定关键字的元素,upper_bound则指向最后一个,如果没有这个元素,那么这两个函数将返回同一个位置,这个返回值可能是end。

equal_range函数

此函数接受一个关键字,返回一个迭代器pair,若关键字存在,则first指向第一个位置,second指向最后一个位置,如果没有找到,则返回关键字可以插入的位置

此程序其实和lower_bound和upper_bound的过程一样,只不过用pair存起来而已。

X 关闭

推荐内容

最近更新

Copyright ©  2015-2022 南非医疗网版权所有  备案号:沪ICP备2022005074号-13   联系邮箱:58 55 97 3@qq.com