一. map/multimap
1.定义:map中所有元素都是pair,第一个元素为键值key,第二个元素为实值value,所有元素根据键值自动排序,属于关联容器,底层结构二叉树
2.头文件:#include<map>
3.用法:
map<typename1,typename2> mp; // 定义mp,typename1为键key即映射前的类型,typename2为值value即映射后的类型。
map<int,int> mp;
mp.insert(pair<int,int>(10,20)); //插入
mp.insert(m_pair(2,10));
mp.insert(map<int,int>::value_type(3,10));
mp[4]=40; //不建议[]插入,可以用key访问value
map<int,int> mp1(mp); //拷贝构造
map<int,int> mp2=mp1; //赋值
mp.size(); //返回mp大小
mp.empty(); //返回mp是否为空
swap(mp1,mp2); //交换mp1和mp2
mp.earse(pos); //删除pos迭代器位置
mp.earse(elem); //删除key值为elem
mp.earse(mp.begin(),mp.end()); //清空
mp.clear(); //清空
mp.find(key); 若存在遍历键值若key存在则返回迭代器否则返回mp.end()
mp.count(key);计算key的数目
map排序
默认按key值从小到大,其他排序需利用仿函数指定规则
class MyCompare
{
public:
bool operator()(int v1,int v2){
return v1>v2;
}
};
map<int,int,MyCompare> mp;
4.map和multimap区别: map不允许重复键值key,存在而multimap允许重复键值key存在
二. set/multiset
1.定义:所有元素插入时自动排序,本质关联容器,底层结构二叉树。
2.头文件: #include<set> 包括set和multiset
3.用法:
set<int> s1;
//插入数据只有insert方式,不许插入重复值
s1.insert(10); //不可指定插入位置,因为set自动排序
set<int> s2(s1); //拷贝构造
set<int> s3=s2; //赋值
s1.size(); //set的大小
s1.empty() //是否为空
swap(s1,s2); //交换s1,s2
s1.earse(s1.begin(),s1.end()); //清除所有元素
s1.clear(); //清空所有元素
s1.earse(elem); //删除指定元素
earse(s1.begin()); //删除首
s1.find(key); //若找到返回迭代器,否则返回s1.end()
s1.count(key); //统计key的元素个数
利用仿函数改变排序规则
class MyCompare
{
public:
bool operator()(int v1,int v2){
return v1>v2;
}
};
set<int,MyCompare> s1;
for(int i=0;i<n;i++){
cin>>n;
s1.insert(n);
}
for(set<int,MyCompare>::iterator it;it<s.end();it++){
cout>>*it>>" ";}
自定义数据类型,指定排序规则
class Person
{
public:
Person(string name,int age){
this->m_name=name;
this->m-age=age;
}
string m_name;
int m_ag;
};
class MyCompare
{
public:
bool operator()(const Person &p1,const Person &p2){
return p1.m_age<p2.m_age;
}
};
set<Person,MyCompare> pset;
4. set和multiset区别:set不允许插入重复数据而multiset允许插入重复数据。
三. pair
1.定义:成对出现的数据,利用对组可以返回两个数据
//创建
pair<string,int> person("Tom",12);
pair<string,int> p=make_pair("Tony",14);
p.first 访问第一个数据
p.second 访问第二个数据