本文目录
1. map定义
map是STL里的一个模板类,用来存放<key, value>键值对的数据结构,它的定义如下。
template < class Key, //map::key_tpe
class T, //map::mapped_type
class Compare = less<Key>, //map::key_compare
class Alloc = allocator<pair<const Key, T>> //map::allocator_type
> class map;
-
第1个参数存储了key。
-
第2个参数存储了mapped value。
-
第3个参数是比较函数的函数对象。map用它来判断两个key的大小,并返回bool类型的结果。利用这个函数,map可以确定元素在容器中遵循的顺序以及两个元素键是否相等(!comp(a,b)&&!comp(b,a)),确保map中没有两个元素可以具有等效键。这里,它的默认值是less<Key>,定义如下。
template <class T> struct less { bool operator() (const T& x, const T& y) const { return x < y;} typedef T first_argument_type; typedef T second_argument_type; typedef bool result_type; };
-
第4个参数是用来定义存储分配模型的。
2. 简单方法: 重载operator<()操作符
在我们插入<key, value>时,map会先通过比较函数地函数对象来比对key的大小,然后根据比对结果进行有序存储。c++标准库中,map比较函数的函数对象不可避免地会用到’<'运算,因此一种方法就是直接在自定义类里重载operator<()操作符,如下所示。
#include <iostream>
#include <map>
#include <string>
using namespace std;
class Person{
public:
string name;
int age;
Person(string n, int a){
name = n;
age = a;
}
bool operator<(const Person &p) const //注意这里的两个const
{
return (age < p.age) || (age == p.age && name.length() < p.name.length(