Map容器概念

Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素具有相同的键值

我们可以通过map的迭代器改变map的键值吗?答案是不行的,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织,如果想要改变元素的实值,那么是可以的

map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外

multimap和map操作类似,唯一区别是multimap键值可以重复。

map和multimap都是以红黑树为底层实现机制

API

构造函数

map<T1,T2>  默认构造

map(const map &mp) //拷贝构造

插入数据操作(返回值为pair<iterator,bool>)

map<int,string> mapStu;

insert(pair<int,string>(3,"校长"))

insert(make_pair(3,"校长"))

insert(map<int,string>::value_type(3,"校长"))

mapStu[3]="小刘"  

赋值操作

map& operator=(const map &mp);//重载等号操作符

swap(map) 交换两个map容器

大小操作

size();

empty();

删除操作

clear()

erase(pos)

erase(beg,end)

erase(keyElem)  //删除容器中key为keyElem的对组

查找操作

find(key) //查找键key是否存在,返回改元素的**迭代器**,若不存在则返回set.end()

count(key) //查找key的元素个数,对于map而言不是1就是0(因为元素不重复)

lower_bound(keyElem) //返回第一个个key>=keyElem元素的迭代器,若不存在则返回set.end()

upper_bound(keyElem) //返回第一个key>keyElem元素的迭代器,若不存在则返回set.end()

equal_range(keyElem) //返回容量中key与keyElem相等的上下限的两个迭代器(pair 对组类型)

指定排序规则(用multimap)

/*************************************************************************
	> File Name: main.cpp
	> Author: 使用自定义数据来简单排序
	> Mail: 
	> Created Time: 2019年12月30日 星期一 20时07分48秒
 ************************************************************************/

# include<iostream>
# include <string>
# include <map>
# include <set>
using namespace std;
class Person{
    public:
        Person(string m_name,string m_tel,short m_age,int m_momey)
    {
        name=m_name;
        tel=m_tel;
        age=m_age;
        momey=m_momey;
    }
   
        Person(const Person * s)  //这个需要加,不知道为什么,没加编译器不让过,其实也就是个默认拷贝构造函数
    {
        name=s->name;
        tel=s->tel;
        age=s->age;
        momey=s->momey;
    }
        string getName()const {return name;}
        string getTel()const {return tel;}
        short  getAge()const {return age;}
        int getMomey()const {return momey;}
    private:
        string name;
        string tel;
        short age;
        int momey;
        
};
class PersonCompare{
    public:
        bool operator ()(const string &p1,const string &p2)
    {
        return p1>p2;
    }


};
int main()
{
    multimap<string,Person,PersonCompare> my;
    my.insert(make_pair("研发部门",new Person("陈官拜","1350512320",15,10000)));

    my.insert(make_pair("研发部门",new Person("王东强","1351232320",25,1000)));
    my.insert(make_pair("测试部门",new Person("才陈他","131233120",50,12000)));
    my.insert(make_pair("研发部门",new Person("拜jia","1352320",15,18900)));
    my.insert(make_pair("业务部门",new Person("ceo","13050",5,103900)));

        cout<<"*****全部部门******"<<endl;
    for(multimap<string,Person,PersonCompare>::iterator it=my.begin();it!=my.end();it++)
    {
        cout<<(*it).first<<"  "<<(*it).second.getName()<<"  年收入"<<(*it).second.getMomey()<<endl;
    }
        cout<<"*****单一******"<<endl;
    
    for(multimap<string,Person,PersonCompare>::iterator it=my.lower_bound("研发部门");  
         it!=my.upper_bound("研发部门");it++)//这里也可以用equal_range
    {
        cout<<(*it).first<<(*it).second.getName()<<"  "<<(*it).second.getMomey()<<endl;
    
    }
    
}

运行结果:
map容器.bmp

彩蛋

lower_bound和upper_boound这两个函数乍一看没什么用,但是其实可以搭配使用得到key相同的迭代器,就像上面代码中写的那
样,在multimap中发挥出特殊的用法,lower_bound作为第一个找到相同的键值也就是上限,upper_boound作为第一个不同的键值
作为下限,因为在multimap容器中键值的排列是有序的(也就是相同的键值是相邻的)。

当然,也可以用equal_range快速搞定。在map容器中好像除了end就是唯一的一个迭代器。