MAP是SLT中的一个容器,是关联式容器。它提供一对一的数据处理能力,其中第一个数据称为关键字,每个关键字只能在map中出现一次,第二个数据代表关键字的值。主要针对的是处理一对一的数据,MAP内部是自建一棵红黑树(一种非严格意义上的平衡二叉树),具有数据自动排序功能,所以MAP内部所有数据是有顺序的,基本是从小到大。
MAP的默认构造函数:
Map(const map& m);拷贝构造函数
Map(iterator begin,iterator end)区间构造函数
Map(iterator begin,iterator end,const traits& _compare)带比较谓词的构造函数
Map(iterator begin,iterator end,const traits& _compare,const allocator& all)带分配器
我们经常用的是前两种,Map的基础函数有:begin,end,rbegin,rend,clear,empty,size,max_size。这些函数都是可以直接应用的。
既然说到MAP容器,和其他容器一样都要从初始化开始。
建立MAP对象
map<int,string> mapTest;
初始化insert和数组直接赋值:
Map的默认构造函数
一、 insert(pair(1,“Thisisatest”))
二、 insert(make_pair(2,“test”))
三、 insert(map<int ,string>::value_type(3,”student”))
前三种如果出现关键字一样的情况,就不会插入。
四、 直接用insert(pair(array[i],str[i]))
这种数组的方式,出现关键字一样的情况,就好覆盖前一个。
tTestMap TestMap[4] = { { 10, "nihao" },
{ 200, "woshishui" },
{ 30, "thisa" },
{ 400, "test" }
};
map<string,tTestMap> TempMap;
string strTest[4] = {"1st","2nd","3rd","4th"};
for (int i = 0; i < 4; ++i)
{
TempMap.insert(make_pair(strTest[i],TestMap[i]));
}
map<string,tTestMap>::iterator TestIt;
for (TestIt = TempMap.begin(); TestIt != TempMap.end(); ++TestIt)
{
printf("%s,%d,%s\n",TestIt->first.c_str(),TestIt->second.nData,TestIt->second.szData);
}
MAP容器的遍历主要是应用迭代器,Iterator上例中已经涉及,初始化后,不符合要求的就要删除,就涉及到erase函数。
如果知道关键字可以直接删除,如果不知道关键字,或者只知道条件,就需要用迭代器,遍历然后把数据删除。
map<string,tTestMap>::iterator TestIt;
int nData = 0;
for (TestIt = TempMap.begin(); TestIt != TempMap.end(); ++TestIt)
{
if (TestIt->second.nData > 100)
{
nData = TempMap.erase(TestIt->first);
TestIt = TempMap.begin();//可能时间效率上要低,需要不断的从新开始遍历。
}
}
下一个涉及到的函数是查找,find和count函数从名字的意义上就可以看出,一个是找,一个是数,找的可以直接查找到该关键字,并且返回的是迭代器,就是关键字的位置。
由于map的定义要求,count返回的是0或1,只能告诉你发现还是未发现。
Map容器的初始化应用也可以应用operator=(const map& m)
map<string,tTestMap> mapHelp;
mapHelp = TempMap;
map<string,tTestMap>::iterator mapHelpIt = mapHelp.begin();
for (;mapHelpIt != mapHelp.end();++mapHelpIt)
{
printf("%s ,%d , %s \n",mapHelpIt->first.c_str(),mapHelpIt->second.nData,mapHelpIt->second.szData);
}
MAP容器的内部构造:
成员函数
-
(constructor)
- map容器的构造函数。
-
(destructor)
- Map容器的析构函数。
-
operator=
- 拷贝容器内容。
迭代器:
-
begin
- 返回第一个元素的迭代器。
-
end
- 返回最后一个元素的下一个为位置的迭代器
-
rbegin
- 返回指向反向第一个位置的反向迭代器
-
rend
- 返回指向最后一个元素的下一个位置的反向迭代器
容器(Capacity):
-
empty
- 测试容器是否为空
-
size
- 返回容器大小
-
max_size
- 返回最大的值
元素访问:
-
operator[]
- 访问元素。
修改容器操作:
-
insert
-
插入元素
-
erase
- 擦除元素
-
swap
- 交换内容(指不同的map容器之间交换)
-
clear
- 清空容器
观察者(Observers):
-
key_comp
- 返回键值比较对象。
-
value_comp
- 返回映射值比较对象。
操作:
-
find
- 获取元素迭代器
-
count
- 计算指定key元素的个数,由于map容器的特点,此值只能取0和1中的一个。
-
lower_bound
- 返回一个迭代器,指向 键值>= key的第一个元素。
-
upper_bound
- 返回一个迭代器,指向 键值> key的第一个元素。
-
equal_range
- Get range of equal elements
分配器:
-
get_allocator
- 获取容器对象
最后再涉及一个reverse_iterator 翻转迭代指针。
map<string,tTestMap>::reverse_iterator rTestIt = TempMap.rbegin();
for (; rTestIt != TempMap.rend(); ++ rTestIt)
{
printf("%s,%d,%s\n",rTestIt->first.c_str(),rTestIt->second.nData,rTestIt->second.szData);
}