Key_Value结构的字典终于登场了。
map/multimap简介:
- map中所有元素都是pair
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
本质:
- map/multimap都属于关联式容器,底层结构是用二叉树实现的。
优点:
- 可以根据key键值快速找到对应的value值。
map和multimap区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复key值元素
构造和赋值
函数原型:
构造:
-
map<T1, T2> mp;
//map默认构造函数: -
map(const map &mp);
//拷贝构造函数
赋值:
-
map& operator=(const map &mp);
//重载等号操作符
void test01()
{
// 创建map容器
map<int, int> m;
// map中所有元素都是成对出现的,插入数据时候要使用对组。map会自动根据key值排序。
m.insert(pair<int, int>(3, 10)); // 里面其实是一个匿名对组。
m.insert(pair<int, int>(2, 30));
m.insert(pair<int, int>(4, 40));
m.insert(pair<int, int>(1, 60));
printMap(m);
// 拷贝构造:
map<int, int> m2(m); // 拷贝构造。
map<int, int> m3(m); // 拷贝构造。
m2 = m3; // 赋值。
}
打印输出:
void printMap(const map<int, int>& m)
{
for (map<int, int>::const_iterator it= m.begin(); it !=m.end(); it++)
{
cout << "Key = " << (*it).first << ",Value = " << (*it).second << endl;
}
}
总结:
- map中所有元素都是成对出现的,插入输入时要使用对组pair。
map容器和大小
函数原型:
-
size();
//返回容器中元素的数目 -
empty();
//判断容器是否为空 -
swap(st);
//交换两个集合容器
map插入和删除元素
函数原型:
-
insert(elem);
//在容器中插入元素。 -
clear();
//清除所有元素 -
erase(pos);
//删除pos迭代器所指的元素,返回下一个元素的迭代器。 -
erase(beg, end);
//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。 -
erase(key);
//删除容器中值为key的元素。按照key来删除数据。
void test02()
{
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));
// 第四种:默认有一个重载的[]
m[4] = 40;
// []不建议使用,用途,可以利用key访问到value
cout << m[4] << endl; // 如果在map中没有m标记的索引为4的元素,则会将m[4] = 0;所以一般不会用第四种插入方式。
// 删除:
m.erase(3); // 删除key为3的值。
m.erase(m.begin());
m.erase(m.begin(), m.end());
m.clear();
}
map查找和统计
函数原型:
- find(key); // 查找key是否存在,
- 若存在,则返回该键的元素的迭代器;
- 如果不存在,返回set.end();
- count(key); // 统计key的元素个数。
map<int, int>::iterator pos = m.find(3);
if (pos != m.end())
{
cout << "找到了元素 key = " << (*pos).first << " value = " << (*pos).second << endl;
}
else
{
cout << "未找到元素" << endl;
}
map容器排序
利用仿函数,可以改变容器的排序规则。
仿函数:就是重载了函数调用的运算符()。仿函数本质上是一个类型。
构造两个类型:
class Person
{
public:
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
enum Level
{
A,
B,
C
};
仿函数:规定排序规则。
class MyCompare
{
public:
bool operator()(Person p1, Person p2)const
{
return p1.m_Age < p2.m_Age;
}
};
void test01()
{
map <Person, Level,MyCompare> m;
Person p1("张三", 18);
Person p2("李四", 20);
Person p3("王五", 19);
m.insert(pair<Person, Level>(p1, A));
m.insert(pair<Person, Level>(p2, B));
m.insert(pair<Person, Level>(p3, C));
for (map<Person, Level>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "姓名:" << it->first.m_Name << ",年龄:" << it->first.m_Age << ",Level:"
<< it->second << "。" << endl;
}
cout << endl;
}