c++ 地图

c++ map

学习map前, 需掌握pair类型

一.什么是map              

 map 是键-值 对 的集合.  map类型通常可理解为关联数组 : 可使用键作为下标来获取一个值, 正如内置数组类型一样. 而关联的本质在于元素的值与某个特定的键相关联, 而并非通过元素在数组中的位置来获取.


二. map对象的定义

 1)  要包含map头文件.   

      #include <map>

 2) 定义map对象时, 必须分别指明键和值的类型

    map<string, int> A;

上述语句定义一个名为A的map对象, 键为string类型, 关联的值为int型.

3) map构造函数

   *  map<k, v> m;  创建一个空的map对象, 键和值分别为k和v

   *  map<k, v> m (m2) ;  创建m2的副本m, m与 m2必须有相同的键值类型

   *  map<k,v> m (b, e ); 创建m, 存储迭代器 b和e标记 的范围内的所有元素的副本, 元素类型必须能转换为 pair<const k, v>

4) 键类型的约束

    键类型必须定义 < 操作符, 而且该操作符能正确地工作.

    例如

       map< vector<int>::iterator, int > B;  // 正确的定义

       map< list<int>::iterator, int> C; //错误的定义, 因为list<int>::iterator 类型不支持<操作符.


三, map类定义的类型

 map<k, v> :: key_type    键的类型

 map<k, v> :: mapped_type 键所关联的值的类型

 map<k, v> :: value_type  一个pair类型, 它的first元素具有const map<k,v>::key_type 类型, 而 second 元素则为map<k,v>::mapped_type类型.

例如上面定义了 map<string, int> A 的 value_type 类型为 pair<const string, int> 类型

要谨记 value_type 类型是pair类型.      


四. 给map 添加元素

   有两种方式:  1. 通过下标操作符   2. insert函数

1) 通过下标操作符

例如,

  map <string, int> word_count;

 word_count ["Anna"] = 1;

上述语句将发生一下事情:

1. 在word_count中 查找键为 Anna的元素, 没有找到

2. 将一个新的键-值对插入word_count中.  它的键是const string 类型的对象, 保存Anna. 而它的值则采用初始化, 本例中初始化为0.

3. 将这个新的键-值对插入word_count中.

4. 读取新插入的元素, 并将它的值赋为1.


用下标访问不存在的元素时将导致在map中添加一个新的元素, 它的键即为下标值.


2) map::insert的使用

m.insert(e)    e必须是value_type类型, 如果e已经存在, 则保持m不变, 返回一个pair类型, 包含指向键为e.first的元素的map迭代器, 以及一个bool类型的对象.

m.insert( beg, end )  插入用迭代器 beg到end范围内的元素

m.insert ( iter, e)


五. 查找并读取map中的元素


1. count

  m.count(k)  若找到键k,则返回1, 否则返回0.

  

2. find

m.find(k) 若找到k, 则返回指向该元素的迭代器, 否则返回超出末端的迭代器.


六. 从map中删除元素

m.erase(k)  删除键为k的元素

m.erase(p) 删除迭代器p指向的元素

m.erase(b,e) 删除一段范围内的元素


七. 遍历

map < string , int >::const_iterator  iter= m.begin();

while (  iter != m.end() )

 ....

}