在开发的场景中会用到将无关的值关联起来,后面会根据一个值来查询、使用其相对应的值,这里键值对是一个不错的选择,即使用c++map的特性实现这一简单功能。
map是一类关联式容器,增加和删除节点对迭代器的影响很小。除了对操作节点有影响,对其他的节点没有什么影响。map主要建立了key到value的映射。key和value可以是任意类型。
注意:对于迭代器来说,可以修改实值,而不能修改key。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次。
快速插入Key - Value 记录。
快速删除记录
根据Key 修改value记录。
遍历所有记录。
使用过程:
#include <map>
map<key,value> key-first, value-second
为了使用方便,可以对模板类进行一下类型定义,
typedef map<int, CString> DEFINEMAP;
DEFINEMAP myMap;
插入map元素:
改变map中的条目非常简单,因为map类已经对[]操作符进行了重载
myMap[1] = "One";
myMap[2] = "Two";
myMap中查找主键为2的项,没发现,然后将一个新的对象插入myMap,键是2,值是一个空字符串,插入完成后,将字符串赋为"Two"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:
myMap.insert(map<int, CString> :: value_type(2, "Two"))
查找并获取map中的元素
下标操作符给出了获得一个值的最简单方法:
CString tmp = enumMap[2];
但是,只有当map中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值。
查找函数:Find(key)和Count()。
begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator
int nFindKey = 2; //要查找的Key
//定义一个条目变量(实际是指针)
myMap::iterator it= enumMap.find(nFindKey);
if(it == enumMap.end()) {
//没找到
}
else {
//找到
}
通过map对象的方法获取的iterator数据类型是一个std::pair对象。
iterator包括两个数据 iterator->first 和 iterator->second 分别代表关键字key和存储的数据value。
从map中删除元素
移除某个map中某个条目用erase(),注意参数是条目iterator
该成员方法的定义如下
iterator erase(iterator it):通过一个条目it对象删除
iterator erase(iterator first, iterator last):删除一个范围 [first,end]里面的元素
size_type erase(const Key& key):通过关键字key删除
clear():删除所有元素
map的基本操作函数:
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);//列表移除
}
#include <iostream>
#include <map>
#include <string>
using namespace std;
void map_insert(map<string,string> *mapStudent, string index, string x){
mapStudent->insert(map<string,string>::value_type(index,x));
}
int main(){
char tmp[32]="";
map<string, string> mapS;
map_insert(&mapS,"192.168.0.128","xiong");
map_insert(&mapS,"192.168.200.3","feng");
map_insert(&mapS,"192.168.200.33","xiongfeng");
map<string, string>::iterator iter;
cout<<"we have there elements"<<endl;
cout<<"----------------------"<<endl;
iter=mapS.find("192.168.200.33");
//查找
cout<<"查找"<<endl;
if(iter!=mapS.end()){
cout<<"find the element"<<endl;
cout<<"it is:"<<iter->second<<endl;
}else{
cout<<"not find the element"<<endl;
}
//遍历
cout<<"遍历"<<endl;
for(iter=mapS.begin();iter!=mapS.end();iter++){
cout<<"| "<<iter->first<<" | "<<iter->second<<" |"<<endl;
}
//删除
cout<<"删除"<<endl;
iter=mapS.find("192.168.200.33");
if(iter!=mapS.end()){
cout<<"find the element"<<endl;
cout<<"delete the element"<<endl;
mapS.erase(iter);
}else{
cout<<"not find the element"<<endl;
}
for(iter=mapS.begin();iter!=mapS.end();iter++){
cout<<"| "<<iter->first<<" | "<<iter->second<<" |"<<endl;
}
return 0;
}