STL -容器 <map> 相关API及原理
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;
}
}
运行结果:
彩蛋
lower_bound和upper_boound这两个函数乍一看没什么用,但是其实可以搭配使用得到key相同的迭代器,就像上面代码中写的那
样,在multimap中发挥出特殊的用法,lower_bound作为第一个找到相同的键值也就是上限,upper_boound作为第一个不同的键值
作为下限,因为在multimap容器中键值的排列是有序的(也就是相同的键值是相邻的)。
当然,也可以用equal_range快速搞定。在map容器中好像除了end就是唯一的一个迭代器。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment