一、map简介
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。
二、map的功能
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
快速插入Key - Value 记录。
快速删除记录
根据Key 修改value记录。
遍历所有记录。
三、使用map
使用map得包含map类所在的头文件:
#include <map> //注意,STL头文件没有扩展名.h
map对象是模板类,需要关键字和存储对象两个模板参数:
map<string, int> my_Map; 或者是: typedef map<string, int> MY_MAP; MY_MAP my_Map;
四、插入元素
map<string, int> my_Map; (1) my_Map["a"] = 1; (2) my_Map.insert(map<string, int>::value_type("b",2)); (3) my_Map.insert(pair<string,int>("c",3)); (4) my_Map.insert(make_pair<string,int>("d",4));
五、查找和修改元素
(1) int i = my_Map["a"]; my_Map["a"] = i; (2) MY_MAP::iterator my_Itr; my_Itr.find("b"); int j = my_Itr->second; my_Itr->second = j;
不过注意,键本身是不能被修改的,除非删除。通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据。
六、删除元素
(1) my_Map.erase(my_Itr); (2) my_Map.erase("c");
注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。
七、迭代数据
for(my_Itr=my_Map.begin(); my_Itr!=my_Map.end(); ++my_Itr) { }
八、其它方法
my_Map.size() 返回元素数目 my_Map.empty() 判断是否为空 my_Map.clear() 清空所有元素
可以直接进行赋值和比较:=, >, >=, <, <=, != 等等
九、基本操作函数:
C++ Maps是一种关联式容器,包含“关键字/值”对
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的函数
十、实例分析:
//遍历: map<string,CAgent>::iterator iter; for(iter = m_AgentClients.begin(); iter != m_AgentClients.end(); ++iter) { if(iter->first=="8001" { this->SendMsg(iter->second.pSocket,strMsg);//iter->first } } //查找: map<string,CAgent>::iterator iter=m_AgentClients.find(strAgentName); if(iter!=m_AgentClients.end())//有重名的 { } else //没有{ } //元素的个数 if (m_AgentClients.size()==0) //删除 map<string,CAgent>::iterator iter=m_AgentClients.find(pSocket->GetName()); if(iter!=m_AgentClients.end()) { m_AgentClients.erase(iter);//列表移除 }