关联容器(有序的和无序的)都支持9.2节中介绍的普通容器操作。
关联容器的迭代器都是双向的。
定义关联容器
对于map 、set的初始化
map<string, int> word_count; //空map
set<string> limit2; //空set
set<string> limit = { "the","a","an" };//具有初始化的set
map<string, int> word_count2 = { {"张三",11},{"李四",12},{"王五",13} };//具有初始化的map,注意的是类型需要一一对应
对于map来说,实际上一个元素是{key,value}
初始化multimap和multiset
与map和set相比,multimap和multiset允许多个元素具有相同关键字,其他的是一致的。
关键字类型的要求
对于有序关联容器,关键字类型中必须定义元素比较方法,默认使用"<"运算符。如果自定义操作代替<运算符,必须在关键字类型上定义一个严格弱序。
也即当没有传入顺序要求,则默认对有序关联容器当中的数据进行key或者set的元素<比较,进行排列座次。
严格弱序:假定这种顺序是小于等于,那么对于不同的关键字,不可能互相小于等于或循环小于等于。如果两个关键字都不小于等于另一个,则而这等价,看作同一关键字。
使用比较函数进行有序关联容器的定义
对于没有<操作符的类,可以自定义比较操作,此时在定义有序容器时,自定义操作类型在尖括号中紧跟着元素类型给出
//注意此处的a b 的类型只能是和有序关联容器中存储的一致。
bool compID(int a, int b) {
return a < b;
};
multiset<int, decltype(compID)*>student(compID);
//multiset<int, bool(*)(int a, int b)>student(&compID); //相当于
pair类型
一个pair保存两个数据成员,是用来生成特定类型的模板。
头文件:
#include<utility>
默认构造函数对数据成员进行值初始化
可以提供列表初始化
基本操作:
操作 | 说明 |
---|---|
pair<T1, T2> p; | p是一个pair,两个类型分别为T1,T2的成员同时进行了值初始化 |
pair<T1,T2> p(v1,v2) | p是一个成员类型为T1和T2的pair,v1和v2分别对其first和second进行了初始化 |
make_pair(v1,v2); | 返回用v1,v2初始化的pair。pair类型通过v1,v2推断出来。 |
p.first | 返回p的first(公有)成员 |
p.second | 返回p的second(公有)成员 |
p1 关系运算符(除了等于和不等于)p2 | 关系运算符(<、>、<=、>=)按字典序定义:举个例子:判断p1<p2:等效于判断(p1.first和p2.first)和(p1.second和p2.second)之间只需要有一组满足<即可。 |
p1 == p2以及p1 != p2 | 需要first和second都相等p1才等于p2,剩下即为不等 |
pair<string, int> process(vector<string>& v) {
if (!v.empty())
{
return { v.back(),v.back().size()};
//早期需要显式构造
//return pair<string, int>(v.back(), v.back().size());
//return make_pair(v.back(), v.back().size());
}
else {
return pair<string, int>();
}
}