一、Map简介
关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置类获取。它的特点是增加和删除节点对迭代器的影响很小,除了操作节点,对其他的节点都没有什么影响。对于迭代器来说,不可以修改键值,只能修改其对应的实值。
二、Map的优势
1. 自动建立Key-value(键值对)的对应。key 和 value可以是任意你需要的类型,但是需要注意的是对于key的类型,唯一的约束就是必须支持<操作符。
2. 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
3. 快速插入Key - Value 记录。
4. 快速删除记录
5. 根据Key 修改value记录。
6. 遍历所有记录。
三、 代码实战分析
领悟代码最重要的还是调试,我把Map的常用用法都自己实现了一遍,关键的地方已经在代码中写好注释了。
#include "stdafx.h"
#include <iostream>
#include <map>
using namespace std;
// 定义一个长度
const static size_t LENGTH = 10;
// 存储消息的结构体
typedef struct data{
int id;
char msg[256];
}DATA_ST;
// 用for循环打印结构体
void showMapUseForLooper(map<int,DATA_ST> v_Map)
{
for (size_t i=0; i<v_Map.size(); i++)
{
cout<<v_Map.at(i).id<<" "<<v_Map.at(i).msg<<endl;
}
}
// 用Iterator迭代器打印结构体
void showMapUseIterator(map<int,DATA_ST> v_Map, map<int,DATA_ST>::iterator iter)
{
for (iter=v_Map.begin(); iter!=v_Map.end(); iter++)
{
// 这里的first和second分别是pair种的第一个数据和第二个数据
cout<<"Map key is = "<<iter->first;
cout<<" "<<iter->second.id<<" "<<iter->second.msg<<endl;
}
}
// 用reverse_iterator迭代器打印结构体
void showMapUseRIterator(map<int,DATA_ST> v_Map, map<int,DATA_ST>::reverse_iterator iter)
{
cout<<"--------反向遍历--------"<<endl;
for (iter=v_Map.rbegin(); iter!=v_Map.rend(); ++iter)
{
cout<<"Map key is = "<<iter->first;
cout<<" "<<iter->second.id<<" "<<iter->second.msg<<endl;
}
}
// 为结构体赋值
void insertValueForDataSt(DATA_ST& v_stData,int id,char* msg)
{
v_stData.id = id;
strcpy_s(v_stData.msg,msg);
}
int main()
{
DATA_ST m_stData;
insertValueForDataSt(m_stData,0,"chengdu_pwrd");
// 实例化map,指定键值对类型为<int, struct>
map<int,DATA_ST> m_Map;
// 实例化迭代器
map<int,DATA_ST>::iterator iter;
map<int,DATA_ST>::reverse_iterator rIter;
char m_cStr[256];
// 1. 直接赋值
m_Map[0] = m_stData;
showMapUseForLooper(m_Map);
for (int i=1; i<LENGTH; i++)
{
/*_itoa_s(i,m_cStr,sizeof(i),10);
strcat_s(m_cStr,sizeof(m_cStr)+4,"pwrd");*/
// 拼接哈字符串,用来辨别添加的值
sprintf_s(m_cStr,"pwrd%d",i);
insertValueForDataSt(m_stData,i,m_cStr);
// 2. 通过insert函数插入数据
/*这里的pair可以这样理解,把<int,DATA_ST>键值对组装成一个数据然后放在map容器中
具体的含义还是参照C++的标准解释吧:http://www.cplusplus.com/reference/utility/pair
*/
m_Map.insert(pair<int,DATA_ST>(i,m_stData));
/*// 另外的一种插入值的方法
m_Map.insert(map<int,DATA_ST>::value_type(i,m_stData));*/
}
/*m_stData.id = 13;
char* v_strTemp = "beijing_pwrd";
// 有"\0"所以要大小要+1
strcpy_s(m_stData.msg,strlen(v_strTemp)+1,v_strTemp);
// 在指定的位置插入值,如果指定的位置是有值得就会遇到插入不成功
m_Map.emplace(pair<int,DATA_ST>(13,m_stData));*/
showMapUseIterator(m_Map,iter);
// 反向遍历
showMapUseRIterator(m_Map,rIter);
/*// 是否为空
m_Map.empty();
// 清空
m_Map.clear();
// 查找指定内容,返回一个迭代器
iter = m_Map.find("pwrd");
// 删除指定位置的值
m_Map.erase(iter);*/
system("pause");
return 0xABCD;
}
下面是打印:
四、 Map常用函数
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数