c++关联容器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>类型的对象来生成每个元素的哈希值
以上是关于c++关联容器的主要内容,如果未能解决你的问题,请参考以下文章