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 ++; }