「目录」
Map用到了就顺便学习总结一下。
1. Map的简介
Map是STL的一种有序无重复的关联容器,它提供 < Key - Value > 形式的数据处理能力,其内部自建一颗非严格意义上的平衡二叉树,这颗树具有按 Key 值对数据自动排序的功能,所以在 Map 内部所有的数据都是有序的。其可以实现对 < Key - Value > 数据的快速插入、删除、查找和遍历等操作。Map 可以根据 Key 值快速查找对应的 Value 值。且对于迭代器而言,增加和删除节点对迭代器的影响很小,且在迭代中不可修改 Key 值。
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;
模板参数的第三个 class Compare = less< Key>
是一种比较函数,通过这个比较函数,map能比较两个不同的 key值的大小关系。默认采用 less< Key>, 即 Key 类型的 "<“操作符。如果 Key类型没有”<"操作符的定义,则需要提供一个自定义比较函数的函数指针,来作为Compare函数。
2. Map的使用
使用 Map 只需要在源代码文件中包含其对应的头文件即可,STL头文件没有扩展名.h
。
#include <map>
由于map的对象是模版类,所以<>
中的模版参数必须进行指定,例如:
using std::map;
using std::string;
map<string,int> maps2i;
在上面的例子中,key 值为 string 类型,而 value 值为 int 类型,在使用中 key 和 value 可以指定为任意类型。由于键和映射值的类型可能有所不同,所以map类以成员类型value_type将其分组在一起,成员类型value_type是将两者结合的成对类型:
typedef pair<const Key, T> value_type;
3. Map成员函数 ( Member functions )
3.1 构造函数 ( Constructor )
C++11中包含了五种构造函数:
- 默认构造函数:构造一个空的map对象,没有元素。
- 范围构造函数:将指定范围内
[first,last)
的元素按对应次序填入map变量中。 - 拷贝构造函数:用另一个同类对象构造当前对象。
- 移动构造函数:和分配器一起移动,构造一个获取元素X的容器。如果分配器被指定并且与X的分配器不同,则元素被移动。 否则,将不会构造任何元素(其所有权将直接转让)。X处于未指定但有效的状态。
- 初始化列表构造函数:通过列表中的每一个元素构造当前对象。
以下代码为常用构造函数的举例说明:
// constructing maps
#include <iostream>
#include <map>
bool fncomp (char lhs, char rhs) {
return lhs<rhs;}
struct classcomp {
bool operator() (const char& lhs, const char& rhs) const
{
return lhs<rhs;}
};
int main ()
{
std::map<char,int> first; // 1. 默认构造函数
first['a']=10; // 对first赋予Key和Value值
first['b']=30;
first['c']=50;
first['d']=70;
std::map<char,int> second (first.begin(),first.end()); // 2. 范围构造函数
std::map<char,int> third (second); // 3. 拷贝构造函数
std::map<char,int,classcomp> fourth; // class as Compare
bool(*fn_pt)(char,char) = fncomp;
std::map<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as Compare
//map<key, value> m(initializer_list<value_type> il) // 5. 列表初始化,value_type是pair类型,所以要构造成pair作为列表
map<key, value> m{
{
key k1, value v1},{
k2, v2}, ...} // 通过 {}构造 pair
map<key, value> m{
make_pair(key k1, value v1), make_pair(k2, v2), ...} // 通过 make_pair() 函数构造 pair
map<key, value> m{
pair<key, value>(k1, v1), pair<key, value>(k2, v2), ...} // 通过类型转换构造 pair
return 0;
}
3.2 赋值操作
copy (1): map& operator= (const map& x);
move (2): map& operator= (map&& x); // 这个不是太明白还
initializer list (3) : map& operator= (initializer_list<value_type> il);
以下代码说明一下拷贝赋值与列表赋值:
// assignment operator with maps
#include <iostream>
#include <map>
int main ()
{
std::map<char,int> first = {
{
'x',8},{
'y',16},{
'z',32}}; // 列表赋值
std::map<char,int> second;
second=first; // second now contains 3 ints 拷贝赋值
first=std::map<char,int>(); // and first is now empty
std::cout << "Size of first: " << first.size() << '\n';
std::cout << "Size of second: " << second.size() << '\n';
return 0;
}
3.3 迭代器 ( Iterators )
迭代器有四组用法,如下所示:
对应的代码可以参考以下代码:
// map::begin/end
#include <iostream>
#include <map>
int main ()
{
std::map<char,int> mymap;
mymap['b'] = 100;
mymap['a'] = 200;
mymap['c'] = 300;
// show content:
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.