前言
本章主要记录pair、map和multimap 类中的各种方法,函数,以及它们的用途
本章内容仅为学习记录,如有纰漏,欢迎指正
一、pair对组
pair实际上是一个键值对,它并不属于STL标准模板库,不需要引入头文件
1.一般常用的实例化方法:
pair<type, type> p1 (key, value);
pair<type, type> p2 = make_pair(key, value);
2.获取元素的方法:
第一个元素为first,第二个为second
调用直接用 对象.first或者 对象.second
//以上面的为例,获取第一个元素(key)
cout << p1.first << endl;
//获取第二个元素(value)
cout << p1.second << endl;
//如果是指针则改成->即可
二、map容器
1.简介
- map中所有元素都是pair
pair中第一个元素为key,第二个元素为value - 所有元素都会根据键值自动排列
- 是一个关联式容器,底层使用二叉树(红黑树)实现
- map不允许容器有重复的key元素
- multimap允许重复的key
2.构造和赋值
map<T1, T2> mp;
map(const map &mp);
map& operator= (const map& mp);
3.大小和交换
size();
empty();
swap(mp);
4.插入
insert(ele);
//插入元素必须是pair(键值对)类型的,可以通过以下方式构建pair
insert(pair<T1, T2>(key, value)); //匿名类方式创建pair,必须指定模板类型
insert(make_pair(key, value)); //使用API创建pair
insert(map<T1, T2>::value_type(key, value)); //指定值类型添加键值对
- 或者可以通过直接 对象[key] = value; 或者 对象key; 的方式进行添加pair,
也可以直接通过 对象[key] 的方式进行运算,非常方便 - 但是需要注意的是,当你调用 对象[key] 时,如果还没有添加这个键值对,
他就会帮你直接添加一个键值对(key, default_value),传入的key作为key,value则为默认值
例:
void test()
{
map<int, int> mp;
mp.insert(pair<int, int>(1, 10));
mp.insert(make_pair(2, 20));
mp[3] = 30;
mp[4] += 40; //value默认值为0,创建后添加40=> value == 40
mp[5]++;
mp[0] = 100;
for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++)
{
cout << it->first << " " << it->second << endl;
}
}
输出结果:
0 100
1 10
2 20
3 30
4 40
5 1
5.删除
clear();
erase(pos);
erase(beg, end);
erase(key);
6.查找和统计
find(key);
count(key); //使用这个API,对于map而言只有1, 0
//multimap可以有多个
7.使用仿函数指定排序规则
- 和set类似,map也有重载版本:map<T1, T2, cmp>;
- 所以同样可以使用仿函数来改变排序规则,其本质是重载()运算符的一个比较类,
而类可以作为模板参数类型传入容器。
class Cmp
{
public:
bool operator()(const int& pre, const int& cur)const
{
return pre > cur;
}
};
int main()
{
map<int, int, Cmp>mp;
mp.insert(make_pair(1, 100));
mp.insert(make_pair(2, 100));
mp.insert(make_pair(3, 100));
mp.insert(make_pair(4, 100));
mp.insert(make_pair(5, 100));
for (auto it = mp.begin(); it != mp.end(); it++)
{
cout << it->first << endl;
}
return 0;
}
输出结果:
5
4
3
2
1