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++关联容器的主要内容,如果未能解决你的问题,请参考以下文章

c++基础——关联容器

关联容器C++

关联容器C++

C++进阶:关联式容器

C++进阶:关联式容器

C++进阶:关联式容器