C++----关联容器

关联容器概述

关联容器(有序和无序的)不支持顺序容器的位置相关的操作,例如push_front或push_back。原因是关联容器中元素是根据关键字存储的,这些操作对关联容器没有意义。而且,关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作。
关联容器的迭代器都是双向的

关键字类型的要求

map的第一个元素是关键字,而set只有一个元素亦是关键字。关联容器对其关键字类型有一些限制。对于有序容器———map、multimap、set以及multiset,关键字类型必须定义元素的比较方法。默认情况下,标准库使用关键字类型的<运算符来比较关键字。

pair类型

在介绍关联容器操作之前,我们需要了解名为pair的标准库类型,它定义在头文件utility中。
一个pair保存两个数据成员。类似容器,pair是一个用来生成特定类型的模板。当创建一个pair时,我们必须提供两个类型名,pair的数据成员将具有对应的类型。

pair<string,string> anon;   //保存两个string
pair<string,size_t> word_count  //保存一个string和一个size_t

pair的默认构造函数对数据成员进行值初始化。我们也可以为每个成员提供初始化器:

pair<string,string> author{"James","Joyce"};

与其他标准库类型不同,pair的数据成员是public的,两个成员分别命名为first和second。我们用普通的成员访问符号来访问它们。

w.fisrt
w.second

关联容器迭代器

当解引用一个关联容器迭代器时,我们会得到一个类型为容器的value_type的值的引用。对map而言,value_type是一个pair类型,其first成员保存const的关键字(不能改),second成员保存值(可以改)。
set的迭代器是const的~
遍历

//获得一个指向首元素的迭代器
auto map_it = word_count.cbegin();
while(map_it != word_count.cend()){
    //解引用迭代器,打印关键字-值 对
    cout<<mao_it->first<<"occurs"
        <<mao_it->second<<"times"<<endl;
    ++map_it; //递增迭代器,移动到下一个元素
}

访问元素

map支持下标操作。正常情况下,解引用一个迭代器所返回的类型与下标运算返回的类型是一样的。但对map不然:当对一个map进行下标操作时,会获得一个mapped_type对象;但当解引用一个map迭代器时,会得到一个value_type对象。
对map和unordered_map类型,下标运算提供了最简单的提取元素的方法。但是,如我们所见,使用下标操作有一个严重的副作用。如果关键字还未在mao中,下标操作会插入一个具有给定关键字的元素。如果你不希望这样做,则用find函数。

无序容器对关键字类型的要求

默认情况下,无序容器使用关键字类型的==运算符来比较元素。它们还使用一个hash< key_type>类型的对象来生成每个元素的哈希值。标准库为内置类型(包括指针)提供了hash模板。还为一些标准库类型,包括sting和只能指针类型定义了hash。因此,我们可以直接定义关键字是内置类型(包括指针类型)、string还有只能指针类型的无序容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值