Stl Map用法

一、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的函数 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值