欠下数据结构的债,迟早是要还的…… 最近写毕业论文过程中,需要用到哈希表的数据结构,此外空闲时间在刷 Leetcode 过程中,发现好多高效算法都是用 unordered_map 实现的,看来学习 map 相关内容是躲不了的了,开始学习 map 的相关内容。 本篇先学习 C++ 中 STL 标准库中 map 的使用方法。
以下内容翻译自:《map - C++ Reference》
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
map 是一种容器,用来存储若干元素,这些元素都是由关键值 (Key Value,以下称为 Key 值) 和映射值 (Mapped Value,以下依旧称为映射值) 配对组成的,具体说明如下: 在一个 map 中, Key 值通常用来排序或特指元素,映射值用来存储与该 Key 值绑定的内容。 Key 值与映射值的数据类型可以不同,而且可以一起被放进成员类型 value_type 中,value_type 是一种配对类型,定义如下:
typedef pair<const Key, T> value_type;
在 map 内部的元素通常按照其 Key 值排序,且排序方式是根据某种明确、严格的弱排序标准进行的,这种排序标准是由 map 内部的比较对象(即 map::key_comp)指定的。 map 容器通过 Key 值访问特定元素的速度,相较于 unordered_map 容器通常较慢,但 map 容器允许基于它们的顺序对子集进行直接迭代。 map 中的映射值可以使用括号运算符 (operator[]) 通过其关联的 Key 值直接访问。 map 通常使用二叉搜索树实现。
<T>
,返回应用小于运算符 (a < b) 相同的值;以下源码摘自《C++STL之map学习》,笔者对其进行注释。
#include <iostream>
#include <map>
using namespace std;
// 比较函数(用于后面的函数指针定义)
bool fncomp(char lhs, char rhs){
return lhs < rhs;
}
// 定义一个 Compare 对象,且内部对运算符 () 进行重载
struct classcomp{
bool operator() (const char& lhs, const char& rhs){
return lhs < rhs;
}
};
int main(int argc, char* argv[])
{
//=========================
// map 的多种构造函数
//=========================
// 1. 直接定义
map<char,int> mymap;
mymap['a'] = 10;
mymap['b'] = 60;
mymap['c'] = 30;
mymap['d'] = 90;
mymap['e'] = 50;
// 2. 复制
map<char, int> second(mymap);
// 3. 通过迭代器
map<char, int> third(mymap.begin(),mymap.end());
// 4. 重新定义 Compare 对象,该对象内部对运算符 () 进行重载
map<char, int, classcomp> fourth;
// 5. 通过函数指针
bool(*fn_pt)(char, char) = fncomp;
map<char, int, bool(*)(char, char)> fifth(fn_pt);
//=========================
// 以最初定义的mymap 为例,讲解 map 的使用
//=========================
map<char,int>::key_compare key_comp;
map<char,int>::iterator it;
it = mymap.begin();
//=========================
// 1. 输出所有 Pair 元素
//=========================
// 迭代器遍历 map
for (it; it != mymap.end(); it++)
{
// map的迭代器,可以用 first 访问std::pair的第一个成员(Type1),second 访问第二个成员 (Type2)
cout<<it->first<<":"<<it->second<<endl;
}
cout<<"================================="<<endl;
//=========================
// 2. 修改映射值
//=========================
second.clear();
second['a']=1002;
second['b']=10023;
while (!second.empty())
{
cout << second.begin()->first << " => ";
cout << second.begin()->second << endl;
second.erase(second.begin());
}
cout<<"================================="<<endl;
//=========================
// 3. 插入
//=========================
mymap.insert(pair<char,int>('f',100) );
mymap.insert(pair<char,int>('g',200) );
cout<<"f => " <<mymap.find('f')->second<<endl;
cout<<"g => " <<mymap.find('g')->second<<endl;
cout<<"================================="<<endl;
//=========================
// 4. Compare 参数的使用
//=========================
key_comp = mymap.key_comp();
cout << "mymap contains:\n";
// 迭代器反向遍历的起始位置
char highest = mymap.rbegin()->first; // key value of last element
it = mymap.begin();
do {
cout << (*it).first << " => " << (*it).second << endl;
} while ( key_comp((*it++).first, highest) );
cout << endl;
return 0;
}
运行结果如下: