关联容器
一、概述
关联容器和顺序容器区别:关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按照他们在容器中的位置来顺序保存和访问的。
关联容器支持高校查找和访问,主要有两个关联容器类型,分别为map和set。
map中的元素是一些关键字—值(key-value)对:关键字起到索引的作用,值则表示与索引相关联的数据
set中每个元素只包含一个关键字:set支持很高效的关键字查询操作—检查一个给定关键字是否在set中。
标准库提供了如下8个关联容器:
允许重复关键字的容器的名字头中都包含multi;
不保持关键字按顺序存储的容器的名字都一单词unorder开头;
举例:
unordered_multi_set:表示一个允许重复关键字,元素无序保存的集合。
二、pair类型
定义在头文件utility中
一个pair保存两个数据成员。类似容器,pair是一个用来生成特定类型模板。当创建一个pair时,我们必须要提供两个类型名,pair的数据成员将具有对应的类型。两个类型不要求一样:
pair<string ,string> anoe;//保存两个string
pair<string ,size_t> word_count;//保存一个string和一个 size_t;
pair的默认构造函数对数据成员进行值的初始化。因此anoe保存两个空的string。
word_count中的size_t为0,string初始化为空。
也可以为每个成员提供初始化器:
pair<string ,string> anoe{“Jame”,“Weide”};
pair的数据成员是public的。两个数据成员分别命名为first和second。我们用普通的成员访问符号(.first和.second)来访问就可以。
三、详解
1、map讲解
(1)map:关键字-值对集合。例如可以将一个人的名字作为关键字,将其电话号码作为值。map类型通常被称为关联数组。关联数组与“正常”数组类似,不同之处在于其下标不必是整数。我们通过一个关键字而不是位置来查找值。
(2)map初始化
当定义一个map时,必须即指明关键字类型又指明值类型;
map<string, size_t> word_count; //空容器
map<string, string> authors={{“Lei”,”LUCY”},{“JON”,”Mary”},{“Hord”,”Hadon”}};
举例:单词计数程序
#include<iostream>
#include<string>
using namespace std;
#include<map>
int main()
{
map<string, size_t> word_count;
string word;
while(cin>>word)
++word_count[word];
for(const auto &w : word_count)
cout<<w.first<<" occurs "<<w.second<<((w.second>1)?"times":"time")<<endl;
return 0;
}
2、set讲解
(1)set:关键字的简单集合。当只是想知道一个值是否存在时,set是最有用的。
(2)初始化set时,只需要指明关键字类型,因为set中没有值。
set<string> exclude = {“the”,”but”,”an”};
//忽略常见的单词,如“the”、“and”、“a”、“or”、“to”等。我们用set保存想要忽略的单词
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
using namespace std;
int main()
{
map<string, size_t> word_count;
set<string> exclude ={"the","and","but","a","an"};
string word;
while(cin>>word)
//只统计不在exclude中的单词
if(exclude.find(word)==exclude.end)
++word_count[word];
for(const auto &w : word_count)
cout<<w.first<<" occurs "<<w.second<<((w.second>1)?"times":"time")<<endl;
return 0;
}
四、关联容器的操作
新增如下类型。这些类型表示容器关键字和值的类型。
set<string>::value_typev1;//v1是一个string
set<string>::key_valuev2;//v2是一个string
map<string,int>::value_type v3;//v3是一个pair<const string, int>
map<string,int>::key_type v4;//v4是一个string
map<string,int>::mapped_typev5;// v5是一个int
注意:
我们一般不对关联容器使用泛型算法。关键字const这一特性意味着不能将关联容器传递给修改或重排容器元素的算法,因为这类算法需要向元素写入值,而set类型中的元素是const的,map中的元素是pair,第一个成员是const的。