目录
一、map基本概念
1、基本介绍
- map中所有元素都是pair
- pair中第一个元素为key(键值),起到索引作用;第二个元素是value(实值)
- 所有元素会根据键值自动排序
2、本质
map/multimap都属于关联式容器,底层结构是用二叉树实现
3、优点
可以根据key值快速找到value值
4、map和multimap的区别
map不允许容器中有重复的key值重复的key值重复的key值元素;multimap允许容器中有重复的key值元素
二、map构造和赋值
1、函数
构造:
- map<T> m; //默认构造函数
- map(const map& m); //拷贝构造函数
赋值:
- map operator=(const map& m); //重载=运算符
2、测试
#include<map>
//map容器 构造和赋值
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key=" << (*it).first <<"value=" << it->second << endl;
}
cout << endl;
}
void Tes01() {
map<int, int> m;//插入时会按照key值自动排序
//map容器中所有元素都是成对出现的,插入数据时要使用对组
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(2, 20));
m.insert(pair<int, int>(4, 40));
printMap(m);
//拷贝构造
map<int, int> m1(m);
printMap(m1);
//赋值
map<int, int> m2;
m2 = m;
printMap(m2);
}
int main() {
Tes01();
return 0;
}
三、map大小和交换
1、函数
size(); //返回容器中元素数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
2、测试
#include<map>
//map容器 大小和交换
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key=" << (*it).first << "value=" << it->second << endl;
}//(*it).first或it->first两种写法都可
cout << endl;
}
//大小
void Tes02() {
map<int, int> m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(2, 20));
if (m.empty()) {
cout << "m为空" << endl;
}
else {
cout << "m不为空" << endl;
cout << "m的大小为:" << m.size() << endl;
}
printMap(m);
}
//交换
void Tes03() {
map<int, int> m1;
m1.insert(pair<int, int>(1, 10));
m1.insert(pair<int, int>(3, 30));
m1.insert(pair<int, int>(2, 20));
map<int, int> m2;
m2.insert(pair<int, int>(4, 100));
m2.insert(pair<int, int>(5, 300));
m2.insert(pair<int, int>(6, 200));
cout << "交换前:" << endl;
printMap(m1);
printMap(m2);
m1.swap(m2);
cout << "交换后:" << endl;
printMap(m1);
printMap(m2);
}
int main() {
Tes02();
Tes03();
return 0;
}
四、map插入和删除
1、函数
insert(elem); //在容器中插入元素
clear(); //清除所有元素
erase(beg,end); //删除[beg,end]区间的数据,返回下一个元素的迭代器
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(key); //删除容器中值为key的元素
2、测试
#include<map>
//map容器 插入和删除
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key=" << (*it).first << "value=" << it->second << endl;
}
cout << endl;
}
void Tes04() {
map<int, int> m;
//插入(四种方式,第四种不太建议用)
m.insert(pair<int, int>(1, 10));
m.insert(make_pair(2, 20));
m.insert(map<int, int>::value_type(3, 30));
//不建议用[]插入,用途主要为利用key访问到value
m[4] = 40;
//cout << m[4] << endl;//40
printMap(m);
//删除
m.erase(m.begin());
printMap(m);
m.erase(3);//按key值删除
printMap(m);
//清空
//erase(m.begin(), m.end());
m.clear();
printMap(m);
}
int main() {
Tes04();
return 0;
}
五、map查找和统计
1、函数
find(key); //查找key是否存在,若存在,返回该元素的迭代器;若不存在,返回map.end()
count(key); //统计元素key的个数
map不允许插入重复key元素,所以count统计要么是0,要么是1;而multimap的count统计可能大于1
2、测试
#include<map>
//map容器 查找和统计
void Tes05() {
map<int, int> m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 20));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(2, 20));
//查找
map<int, int>::iterator pos = m.find(2);//find返回的是迭代器
if (pos != m.end()) {
cout << "查找到了元素key=" << (*pos).first << "value=" << pos->second << endl;
}
else {
cout << "未找到元素" << endl;
}
//统计
//map不允许插入重复key元素,count统计,要么是0,要么是1
//multimap的count统计可能大于1
int num = m.count(2);
cout << "num=" << num << endl;
}
int main() {
Tes05();
return 0;
}
六、map容器排序
- map容器的默认排序规则为:按照key值从小到大排列,可以利用仿函数改变排序规则
- 对于自定义类型的数据,必须指定排序规则
1、内置数据类型
#include<map>
//map容器 排序--默认排序规则是按key值从小到大排
//利用仿函数,可以改变排序规则
class myCompare {
public:
bool operator()(int v1, int v2)const {
//降序
return v1 > v2;
}
};
void Tes06() {
map<int, int,myCompare> m;
m.insert(make_pair(1, 10));
m.insert(make_pair(2, 20));
m.insert(make_pair(3, 30));
m.insert(make_pair(4, 40));
m.insert(make_pair(5, 50));
for (map<int, int,myCompare>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key=" << it->first << "value=" << it->second << endl;
}
cout << endl;
}
int main() {
Tes06();
return 0;
}
2、自定义数据类型
#include<map>
//map容器 排序--自定义数据类型
//利用仿函数,可以改变排序规则
//按年龄升序,年龄相同时按身高降序
class Person {
public:
string m_Name;//姓名
int m_Age;//年龄
int m_Height;//身高
Person(string name, int age,int height) {
this->m_Name = name;
this->m_Age = age;
this->m_Height = height;
}
};
class myCompare {//制定排序规则
public:
bool operator()(const Person& p1,const Person& p2) const {
//按年龄升序,年龄一样时按身高降序
if (p1.m_Age == p2.m_Age) {
return p1.m_Height > p2.m_Height;
}
else {
return p1.m_Age < p2.m_Age;
}
}
};
void Tes07() {
map<Person, int, myCompare> m;
Person p1("刘晨", 24,177);
Person p2("张立", 20,195);
Person p3("王敏", 28,184);
Person p4("张三", 24,185);
Person p5("李四", 25,179);
m.insert(make_pair(p1, 10));
m.insert(make_pair(p2, 20));
m.insert(make_pair(p3, 30));
m.insert(make_pair(p4, 40));
m.insert(make_pair(p5, 50));
for (map<Person, int, myCompare>::iterator it = m.begin(); it != m.end(); it++) {
cout << "姓名:" << (*it).first.m_Name <<"年龄:" << (*it).first.m_Age <<"身高:" << (*it).first .m_Height<< "value=" << it->second << endl;
}
cout << endl;
}
int main() {
Tes07();
return 0;
}
有错误欢迎指正!