C++进阶STL-map、multimap
map、multimap容器
- (1)map相对于set来说,map具有键值和实值,将元素组合成pair再插入到map容器,pair的第一个元素被称为键值,第二个元素被称为实值。
- (2)map也是以红黑树为底层的实现机制,map容器根据插入元素的键值会自动排序,如果不是普通类型,需要自定义规则
- (3)map的键值不可以重复,实值可以重复,multimap键值实值都可以重复
- (4)map的键值不可修改,可以改变实值,想修改键值只有删除再插入
map构造函数
- map
mymap //默认构造 - map(const map& mymap) //拷贝构造
map赋值
- map& operator(const map& mymap) //重载=操作符
- swap(mymap) //交换两个容器
map大小
- size() //返回容器中元素的个数
- empty() //判断容器是否为空
map插入元素
- mymap.insert( pair
(T1实例,T2实例) ) - mymap.insert( make_pair(T1实例,T2实例))
- mymap.insert( map
::value_type(T1实例,T2实例)) mymap[T1实例]=T2实例
map< int, int>mymap;
//方法1
mymap.insert(pair<int, int>(10, 10));
//方法2
mymap.insert(make_pair(20, 20));
//方法3
mymap.insert(map<int, int>::value_type(30, 30));
//方法4
mymap[40] = 40;
for (map<int, int>::iterator it = mymap.begin(); it != mymap.end(); it++)
{
cout << "key is: " << it->first << ";"<< " value is :" << it->second << endl;
}
结果:
NOTE:
- 如果用mymap.insert插入相同key的元素不会成功
- 但是用 mymap[40]=10 去插入,如果容器中有相同的key值的元素,则修改此元素的value值为10
- 如果访问map容器中没有的元素,如:cout << “mymap[50]:” << mymap[50] << endl;,容器会添加key=50的元素,value值初始化为0
map元素删除
- clear() //清除所有元素
- erase(pos) //删除pos迭代器所指的元素,返回下一个元素的迭代器
- erase(begin(),end() ); //删除[begin end]之间的所有元素,返回下一个元素的迭代器
- erase(key) //删除容器中键值为key的元素
map元素查找
- find(key) //查找key键值是否存在,若存在返回第一次出现该键的元素的迭代器,若不存在,返回map.end()
- count(key) //返回容器中键值为key的元素的个数,对于map来说要么0,要么1,对于multimap来说有可能大于1
- lower_bound(key) //返回第一个键值 >= key 的元素的迭代器 @1
- upper_bound(key) //返回第一个键值 > key 的元素的迭代器 @2
- equal_range(key) //返回pair<@1,@2 >
实例: 在1 2 3 4 中equal_range(2) ,第一个>=2 的是2,第一个> 2是3,应该返回 2 , 3
map<int, int> mymap;
mymap.insert(make_pair(1,10));
mymap.insert(make_pair(2,20));
mymap.insert(make_pair(3,30));
mymap.insert(make_pair(4, 40));
pair<map<int, int>::iterator, map<int, int>::iterator> mypair = mymap.equal_range(2);
cout << mypair.first->first << " : "<< mypair.first->second << endl;
cout << mypair.second->first<< " : " << mypair.second->second << endl;
结果:
map容器的自定义排序规则
#include "stdafx.h"
#include <map>
#include <iostream>
using namespace std;
class Key
{
public:
Key(int ID, int age):m_ID(ID),m_age(age) { }
int m_ID;
int m_age;
};
struct Compare //自定义的规则,用Key.m_age排序 ,从小到大
{
bool operator()(const Key& key1, const Key& key2)
{
return key1.m_age < key2.m_age;
}
};
int main()
{
map<Key, int, Compare> mymap;
mymap.insert(make_pair(Key(1, 1), 1));
mymap.insert(make_pair(Key(2, 2), 2));
mymap.insert(make_pair(Key(3, 3), 3));
mymap.insert(make_pair(Key(4, 4), 4));
for (map<Key, int, Compare>::iterator it=mymap.begin(); it != mymap.end(); it++)
{
cout << it->first.m_age << " : " << it->first.m_ID << " : " << it->second << endl;
}
return 0;
}
结果:struct Compare 返回的是 return key1.m_age < key2.m_age;
结果:struct Compare 返回的是 return key1.m_age > key2.m_age;
map容器的综合小实例
- 给5个员工分配部门,每个员工具有:姓名,电话,年龄,薪水
- 部门有三个:销售部,研发部,财务部
按照部门打印出每个员工的信息
include “stdafx.h”
include
include
include
include
include
using namespace std;
#define SALE_DEPARTMENT 1
#define DEVELOP_DEPARTMENT 2
#define FINACIAL_DEPARTMENT 3
class Worker
{
public:
string m_name;
string m_tele;
int m_age;
int m_salary;
};
//创建员工
void Creat_Worker(vector<Worker>& Workers)
{
string seed = "ABCDE";
for (int i = 0; i < 5; i++)
{
Worker Wok;
Wok.m_name = "员工";
Wok.m_name+=seed[i];
Wok.m_age = rand() % 10 + 20;
Wok.m_salary = rand() % 10000 + 10000;
Wok.m_tele = "010-73829783";
Workers.push_back(Wok);
}
}
//员工分组
void Worker_Group(vector<Worker>& Workers, multimap <int, Worker>& Workergroup)
{
srand(time(NULL));
for (vector<Worker>::iterator it = Workers.begin(); it != Workers.end(); it++)
{
int DeparID = rand() % 3 + 1;
switch (DeparID)
{
case SALE_DEPARTMENT:
Workergroup.insert(make_pair(SALE_DEPARTMENT, (*it)));
break;
case DEVELOP_DEPARTMENT:
Workergroup.insert(make_pair(DEVELOP_DEPARTMENT, (*it)));
break;
case FINACIAL_DEPARTMENT:
Workergroup.insert(make_pair(FINACIAL_DEPARTMENT, (*it)));
break;
default:
break;
}
}
}
//打印部门员工
void ShowWorkers(multimap <int, Worker>& Workergroup, int dep)
{
//打印销售部SALE_DEPARTMENT
multimap<int, Worker>::iterator it = Workergroup.find(dep);
int num = Workergroup.count(dep);
for (it; it != Workergroup.end() && num != 0; it++, num--)
{
cout << "name: " << it->second.m_name << endl;
cout << "age:" << it->second.m_age << endl;
cout << "salary:" << it->second.m_salary << endl;
cout << "tel:" << it->second.m_tele << endl;
}
}
//打印每个部门的员工信息
void Print_Worker(multimap <int, Worker>& Workergroup)
{
cout << "---------------销售部---------------" << endl;
ShowWorkers(Workergroup, SALE_DEPARTMENT);
cout << "---------------研发部---------------" << endl;
ShowWorkers(Workergroup, DEVELOP_DEPARTMENT);
cout << "---------------财务部---------------" << endl;
ShowWorkers(Workergroup, FINACIAL_DEPARTMENT);
}
int main()
{
vector<Worker> Workers;
multimap <int, Worker> Workergroup;
//创建员工
Creat_Worker(Workers);
//员工分组
Worker_Group(Workers, Workergroup);
//打印每个部门的员工信息
Print_Worker(Workergroup);
return 0;
}
结果:
还没有评论,来说两句吧...