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容器的内部构造:
迭代器:
容器(Capacity):
元素访问:
修改容器操作:
观察者(Observers):
操作:
分配器:
最后再涉及一个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); }