Map容器的简介
map是标准的关联式容器,一个map是一个兼职对序列,即(key,value)对。他提供基于key的快速检索能力
map中key值是唯一的,集合中得元素按一定的顺序排列,元素插入过程是按照排序规则插入,所以不能指定插入位置。
map的集体实现采用红黑树变体的 平衡二叉树 的数据结构,在插入操作和删除操作上比 vector 快。
mao可以直接存取key所对应的value,支持 [ ] 操作符,例如:map[key] = valie。
multimap与map的区别:map支持唯一键值,每个键只能出现一次。 而multimao中相同键可以出现多次。 multimap不支持 [ ] 操作符。
使用的时候需要包含头文件:#include <map>
map/multimap的默认构造函数
/*map、mutimap采用模板类实现,对象的默认构造形式*/
template <class T>
mao<T1,T2> zploo;
multimap <T1,T2> zploo;
//其中 T1 T2 还可以用各种指针类型或自定义类型
map对象的拷贝构造与赋值
map(const map& zploo); //拷贝构造函数
map& operator= (const map& zploo); //重载等号操作符
map.swap(zploo); //交换两个集合容器
map的大小
map.size(); //返回容器中元素的数目
map.empty(); //判断容器是否为空
map的插入与迭代器
map.insert(...); //让容器中插入元素,返回pair<iterator , bool>
//1.通过pair的方式插入对象
map<int ,string> zploo;
zploo.insert(pair<int , string>(1,"小庄"));
//2.通过pair的方式插入对象
zploo.insert(make_pair(2,"小朋"));
//3.通过value——type的方式插入对象
zploo.insert(map<int , string>::value_type(3,"小龙"));
//4.通过数组的方式插入值
zploo[4] = "呵呵";
上面代码中前三种方法,采用insert() 方法,该方法返回值为 pair<iterator , bool>
第四中方法非常直观,但是存在一个性能的问题,插入3是,现在zploo中插入主键为 3 的项,如果没找到就新增一个 键值为 3,值为初始化的对组。然后再将 值 改成“呵呵” 如果发现已经存在,则修改这个键 相应的值。
string strName = zploo[2]; // 取操作或插入操作
//只有当zploo存在2 这个键是菜正确的取操作,否则会自定插入一个实例,键为 2,值为初始化值。
map与迭代器相关函数
map.begin(); //返回容器中第一个数据的迭代器
map.end(); //返回容器中最后一个数据之后的迭代器
map.rbegin(); //返回容器中倒数第一个元素的迭代器
map.rend(); //返回容器中倒数最后一个元素的后面的迭代器
map的删除与排序
map.clear(); //删除所有元素
map.erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
map.erase(beg,end); //删除 beg到end区间内所有的元素,返回下一个元素的迭代器
map.erase(keyElem); //删除容器中key为leyElem的对组
//排序
map.<T1, T2, less<T1> > zploo; //该容器是按键值的升序方式排序,默认就是采用升序排序
map.<T1, T2, greater<T1> > zploo; //该容器是按键值的降序方式排序
/*
less<T1> 和 greater<T1> 可以替换成其他的函数对象 functor
可编写自定义函数对象进行自定义类型的比较,使用方法与set构造时所用的函数对象一样(不了解的可以翻翻我前面发的博客)
*/
map的查找
map.find(key); //查找键是否存在,存在返回改元素的迭代器,不存在返回map.end();
map.count(keyElem); //返回容器中key是keyElem的岁组个数,对于map 返回值要是是 0要么是1 ,对于multimap来说返回值可能大于1
map.lower_bound(keyElem); //返回第一个key >= (大于等于) keyElem元素的迭代器
map.upper_bound(keyElem); //返回第一个key > (大于) keyElem元素的迭代器
map练习演示代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <map>
#include <string>
#include <functional>
#include <set>
using namespace std;
void testMap()
{
set<int, greater<int>> s;
map<int, string, greater<int>> m;
//方法一
m.insert(pair<int, string>(1, "teacher1"));
//方法二
m.insert(make_pair(2, "teacher2"));
//方法三
pair<map<int, string>::iterator, bool> insertResult = m.insert(map<int, string>::value_type(3, "teacher3"));
if (insertResult.second == true) {
cout << "插入成功" << endl;
cout << insertResult.first->first << " , " << insertResult.first->second << endl;
}
else {
cout << "插入失败" << endl;
cout << insertResult.first->first << " , " << insertResult.first->second << endl;
}
insertResult = m.insert(map<int, string>::value_type(3, "teacher33"));
if (insertResult.second == true) {
cout << "插入成功" << endl;
cout << insertResult.first->first << " , " << insertResult.first->second << endl;
}
else {
cout << "插入失败" << endl;
cout << insertResult.first->first << " , " << insertResult.first->second << endl;
}
//方法四
m[4] = "teacher4";
m[4] = "teacher44"; //会强制覆盖 key
for (map<int, string>::iterator it = m.begin(); it != m.end(); it++)
{
cout << it->first << " , " << it->second << endl;
}
cout << " --- " << endl;
cout << m[4] << endl;
while (!m.empty()) {
map<int, string>::iterator it = m.begin();
m.erase(it);
}
if (m.empty() == true) {
cout << "kong" << endl;
}
m.clear();
if (m.empty() == true) {
cout << "kong" << endl;
}
}
void testMultiMap()
{
multimap<int, string> mm;
mm.insert(pair<int, string>(1, "teacher11"));
mm.insert(make_pair(2, "teacher22"));
mm.insert(multimap<int, string>::value_type(2, "teacher2222"));
//mm[2] = "teaher33";
//multimap 不支持 []方法
for (multimap<int, string>::iterator it = mm.begin(); it != mm.end(); it++) {
cout << it->first << " , " << it->second << endl;
}
}
int main(void)
{
//testMap();
testMultiMap();
return 0;
}
multimap练习演示代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <map>
#include <string>
using namespace std;
/*
公司有销售部(sale)(员工2名)、技术研发部
(development)(1人)、财务部(Financial)(2人)
人员信息有:姓名(name),年龄(age),电话(tel)、工资
(salary)等组成
通过 multimap进行 信息的插入、保存、显示.
*/
class Person
{
public:
Person(string name, int age, string tel, double salary)
{
this->name = name;
this->age = age;
this->tel = tel;
this->salary = salary;
}
void display()
{
cout << "姓名: " << this->name << " , age:" << this->age << ", tel : " << this->tel << " salary: " << this->salary << endl;
}
private:
string name;
int age;
string tel;
double salary;
};
int main(void)
{
Person p1("老王", 18, "12312321321", 4000);
Person p2("包小姐", 18, "12312321321", 200000);
Person p3("李BOSS", 58, "1231232132312321", 100000);
Person p4("老郭", 28, "1231232132312321", 2000001);
Person p5("张工", 27, "12312332312321", 14000);
multimap<string, Person> companyMap; //公司的map容器
//插入
companyMap.insert(pair<string, Person>("sale", p2));
companyMap.insert(pair<string, Person>("sale", p3));
companyMap.insert(pair<string, Person>("development", p1));
companyMap.insert(pair<string, Person>("Financial", p4));
companyMap.insert(pair<string, Person>("Financial", p5));
//全部遍历
for (multimap<string, Person>::iterator it = companyMap.begin(); it != companyMap.end(); it++)
{
cout << "部门:" << it->first << endl;
it->second.display();
}
cout << " ---- " << endl;
//只打印 财务部
pair<multimap<string, Person>::iterator, multimap<string, Person>::iterator>
range = companyMap.equal_range("Financial");
for (multimap<string, Person>::iterator it = range.first; it != range.second; it++)
{
cout << "部门:" << it->first << endl;
it->second.display();
}
cout << " -----" << endl;
//方法二
int cnt = companyMap.count("sale");
multimap<string, Person>::iterator it = companyMap.find("sale");
if (it != companyMap.end()) {
for (int i = 0; i < cnt; i++, it++) {
cout << "部门:" << it->first << endl;
it->second.display();
}
}
return 0;
}