map简介

STL的关联容器,提供一对一的hash(关键字key-关键字的值value)。
每个关键字在map中都是唯一的。

1、map用途和原理

map以 泛型 方式实现,可存储任意类型数据。主要用于one-to-one映射

map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的。

2、map使用

使用map得包含map类所在的头文件

#include <map>                                    //注意,STL头文件没有扩展名.h

map对象是模板类,需要关键字和存储对象两个模板参数:

std:map<int, string> personnel;

这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.

3、map的构造函数

通常这样构造map:

map<int, string> mapDogs;

4、插入元素

// 定义一个map对象
map<int, string> mapDogs;

// 第一种 用insert函數插入pair
mapDogs.insert(pair<int, string>(000, "Dog_zero"));

// 第二种 用insert函数插入value_type数据
mapDogs.insert(map<int, string>::value_type(001, "Dog_one"));

// 第三种 用"array"方式插入
mapDogs[123] = "Dog_first";

mapDogs[456] = "Dog_second";

* insert *插入时:如下两行代码所示的情况,第一行中001这个关键字对应的值是“student_one”,当map中有这个关键字时,insert操作是不能在插入数据的,即第二条语句并没有生效。

mapDog.insert(map<int, string>::value_type (001, "Dog_one"));

mapDogt.insert(map<int, string>::value_type (001, "Dog_two"));

那么如何判断insert是否插入成功,可以使用 pair

// 构造定义,返回一个pair对象
pair<iterator,bool> insert (const value_type& val);

pair<map<int, string>::iterator, bool> Insert_Pair;

Insert_Pair = mapDog.insert(map<int, string>::value_type (001, "Dog_one"));

if(!Insert_Pair.second)

    cout << ""Error insert new element" << endl;

5、查找元素

当所查找的key出现时,返回数据所在对象的位置;如果沒有,返回iter与end函数的值相同。

// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapDog.find("123");

if(iter != mapDog.end())

       cout<<"Find, the value is"<<iter->second<<endl;

else

   cout<<"Do not Find"<<endl;

6、删除与清空

//迭代器刪除
iter = mapDog.find("123");

mapDog.erase(iter);

//用关键字刪除
int n = mapDog.erase("123"); //如果刪除了则返回1,否则返回0

//用迭代器范围刪除 : 把整个map清空
mapDog.erase(mapDog.begin(), mapDog.end());

//等同于mapDog.clear()

7、map的基本操作

函数名 相应操作
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
erase() 删除一个元素
find() 查找一个元素
insert() 插入元素
max_size() 返回可以容纳的最大元素个数
size() 返回map中元素的个数
swap() 交换两个map

map的遍历

1、定义:map <int, CString> 或者map <int, 结构体名> 的元素遍历。

 map < int, CString > maps;   或者   map < int, 结构体名> maps;
      for(int  i=0;i<maps. size();i++) 
            {
                  CString s=maps[i];
             }

2、定义:map <CString , 结构体名> 的元素遍历。

 map <CString , 结构体名>  maps;    
        map <CString , 结构体名>::iterator iter;
         for(iter=maps.begin(); iter!=maps.end(); iter++)
          {
              CString a = iter - > first;
              结构体名 p = iter - > second;
         }

举例如下:

//定义了一个用int作为索引,并拥有相关联的指向string的指针m
map<string,int> m;

//map<int, string>::iterator iter 是声明一个 迭代器
//map<int, string> iter 是 声明一个map容器 
map<string,int>::iterator it;

it = m.begin();

while(it != m.end())
{
    //it->first;
    //it->second;
    it ++;         
}