关联容器:
标准库提供八个关联容器:八个容器的不同体现在三个维度:
1.或者是一个set,或者是一个map;
2.或者要求重复的关键字,或者要求关键字不可重复;体现在有无multi;
3.按顺序保存元素,或者无序;无序都以unordered开头,如unordered_map;
map;
set;
multimap;有序的可重复的map;
multiset有序的关键字可重复的set;
unordered_map;无序,关键字不能重复的map;
unordered_set;无序,关键字不能重复的set
unordered_multimap;无序,关键字可重复出现的map;
unordered_multiset;无序,关键字可重复出现的set;
头文件分别为:map,set,unordered_map;unordered_set;
map类型也称作关联数组,不同的是其下标不一定是数字,可以是多种关键字,;
set是关键字的简单集合,当只想知道一个值是否存在时,使用set,如一个企业可以使用set保存开过支票的人;
关联容器的数据结构将决定搜索的效率和安全性;
定义关联容器:
初始化map时,将每个关键字-值对包围在花括号中:{key,value};
multi的原因:比如一个字典中,一个单词有多个含义,这时就要使用multiset,
关键字类型的要求:
对于有序容器,关键字类型必须定义元素比较的方法,默认情况下标准库使用关键字类型的<运算符比较两个关键字。因此如果关键字类型是类类型,必须重载<运算符;相应的如果一个类型定义了行为正常的<运算符,就可以用作关键字类型;
自定义set,map:
为了使用自己的定义,在定义multiset时必须提供两个类型,关键字类型,以及比较操作类型——一种函数指针类型;定义如下:
multiset<Sales_Data,decltype(compareIsbn)*>bookstore(compareIsbn);
使用decltype指定自定义操作类型;
pair类型:
头文件:utility中;
构造函数:包括有参构造函数和列表初始化两个;
类似于new,也可以用,make_pair(k,v)初始化一个pair,
关系运算符:按字典序定义:当p1.first<p2.first或者!(p2.first<p1.first)&&p1.second<p2.second时,p1<p2成立;而map,set,multiset,multimap只根据关键字的<运算符来进行排序;跟pair.second无关;
==,!=:当first,second都相等时,两个pair相等;
关联容器操作
关联容器定义的类型:
key_type:此容器类型的关键字类型,
mapped_type:map容器的值类型,即value类型;
value_type:对于set与key_value相同,对于map,为pair<const key_type,mapped_type>;
set<string>::value_type v1//v1是string,
map<string,int>::value_type v2//v2是一个pair<const string,int>
关联容器迭代器:关键字类型都是const,无法通过迭代器修改他们,但值类型可以修改;
添加元素
使用insert,emplace函数,有时我们有想要插入的数据,但没有现成的元素,可以使用构造函数来插入,或者使用emplace函数传入相应的参数;
vector<int>ivec={2,3,4,5,6,7,8,9,0};
set<int>set1;
set1.insert(ivec.cbegin(),ivec.cend());
删除元素