9 map/multimap容器
9.1 map 容器基本概念
简介:
map中所有元素都是pair,pair中第一个元素为key(键值),起到索引作用,第二个元素为value(值)。所有元素都会根据元素的键值自动排序
本质:
map/multimap属于关联式容器,底层结构是使用二叉树实现
优点:
可以根据key值快速找到value值
map和multimap的区别:
map不允许容器中有重复的key元素
multimap允许容器中有重复的key值元素
9.2 map 构造和赋值
功能描述:对map容器进行构造和赋值
函数原型:
(1)构造函数
1.map< T1,T2> mp;——默认构造函数
2.map(const map&mp);——拷贝构造函数
(2)赋值函数
map &operator=(const map &mp);——重载=运算符
#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <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;
}
}
void test01()
{
//(1)map构造函数
//1.默认构造函数
map<int, int>m;
m.insert(pair<int,int>(1,10));
m.insert(pair<int,int>(2,32));
m.insert(pair<int,int>(3,14));
printMap(m);
cout << endl;
//2.拷贝构造函数
map<int, int>m2(m);
printMap(m2);
cout << endl;
//(2)map赋值操作
map<int, int>m3 = m;
printMap(m3);
}
int main()
{
test01();
}
9.3 map 大小和交换
功能描述:统计map容器大小及交换map容器
函数原型:
(1)m.size();——返回容器中元素个数
(2)m.empty();——判断容器是否为空
(3)m1.swap(m2);——交换两个集合容器
#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <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;
}
}
void test01()
{
map<int, int> m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 32));
m.insert(pair<int, int>(3, 14));
printMap(m);
cout << endl;
//1.返回容器中元素个数:m.size()
cout << "容器中元素个数为:" << m.size() << endl;
//2.判断容器是否为空:
if (m.empty())
{
cout << "map容器为空!" << endl;;
}
else
{
cout << "map容器不为空!" << endl;
}
//3.交换两个map
map<int, int> m2 ;
m2.insert(pair<int, int>(5, 16));
m2.insert(pair<int, int>(4, 2));
m2.insert(pair<int, int>(3, 33));
cout << "交换前——————————" << endl;
printMap(m);
cout << endl;
printMap(m2);
cout << "交换后——————————" << endl;
m.swap(m2);
printMap(m);
cout << endl;
printMap(m2);
}
int main()
{
test01();
}
9.4 map 插入和删除
功能描述:对容器中的元素进行
(1)插入(m.insert())
(2)删除(m.erase())
函数原型:
(1)m.insert(elem);——在容器中插入元素
(2)m.clear();——清空容器中所有元素
(3)m.erase(pos);——删除pos迭代器所指的元素,返回下一个元素的迭代器
(4)m.erase(beg,end);——删除区间[beg,end)的所有元素,返回下一个元素的迭代器
(5)m.erase(key);——删除容器中key为key的元素
#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <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;
}
}
void test01()
{
map<int, int> m;
//(1)插入元素
//1.插入元素:m.insert(pair<int,int>(d1,d2))
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 32));
m.insert(pair<int, int>(3, 14));
m.insert(pair<int, int>(6, 2));
m.insert(pair<int, int>(4, 18));
//2.插入元素:m.insert(make_pair(d1,d2))
m.insert(make_pair(5, 18));
//3.插入元素:m[key]=value;
m[8] = 21;
printMap(m);
cout << endl;
//(2)删除元素
//1.删除pos迭代器所指的元素
map<int, int>::iterator it = m.begin();
++it;
m.erase(it);
printMap(m);
cout << endl;
//2.删除区间[beg,end)迭代器之间的元素:m.erase(beg,end)
m.erase(++m.begin(), --m.end());
printMap(m);
cout << endl;
//3.删除容器中key=key的元素:m.erase(key)
m.erase(1);
printMap(m);
cout << endl;
//4.清除迭代器中所有元素:m.clear();
m.clear();
printMap(m);
}
int main()
{
test01();
}
9.5 map 查找和统计
功能描述:对map数组进行查找(m.find(key))和统计数据(m.count(key))
函数原型:
(1)m.find(key);——查找key是否存在,存在返回该键的元素的迭代器,不存在,返回m.end();
(2)m.count(key);——统计key元素的个数
#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <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;
}
}
void test01()
{
map<int, int> m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 32));
m.insert(pair<int, int>(3, 14));
m.insert(pair<int, int>(6, 2));
m.insert(pair<int, int>(4, 18));
printMap(m);
//1.查找:m.find(key),存在则返回该元素的迭代器,不存在返回m.end()
map<int, int> ::iterator it = m.find(2);
if (it != m.end())
{
cout << "查找成功!key=" <<(*it).first<<"value="<<(*it).second<< endl;
}
else
{
cout << "查找失败!" << endl;
}
//2.统计元素key的个数:m.count(key).map不允许插入重复数据,count函数来说返回结果要么为0要么为1
cout << "原始key的个数为:" << m.count(2) << endl;
}
int main()
{
test01();
}
9.6 map 容器排序
学习目标:map容器默认排序规则为按照key值从小到大排序,掌握如何改变排序规则
技术要点:利用仿函数,改变排序规则(本质是重载()运算符)
#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <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;
}
}
//自定义仿函数
class MyCompare
{
public:
bool operator()(int v1, int v2)
{
//默认排序规则是按照key升序排列,改变规则为降序
return v1 > v2;
}
};
void test01()
{
//1.创建map容器并插入数据:默认排序为升序
map<int, int> m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 32));
m.insert(pair<int, int>(3, 14));
m.insert(pair<int, int>(6, 2));
m.insert(pair<int, int>(4, 18));
printMap(m);
//2.创建map容器并插入数据:使用自定义排序方式
map<int, int,MyCompare> m1;//传入排序规则函数
m1.insert(pair<int, int>(1, 10));
m1.insert(pair<int, int>(2, 32));
m1.insert(pair<int, int>(3, 14));
m1.insert(pair<int, int>(6, 2));
m1.insert(pair<int, int>(4, 18));
for (map<int, int,MyCompare>::iterator it = m1.begin(); it != m1.end(); it++)
{
cout << "key=" << (*it).first << " value=" << (*it).second << endl;
}
}
int main()
{
test01();
}