STL map

    技术2022-05-20  33

    一.map Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.

    二.构造函数 map共提供了6个构造函数,这块涉及到内存分配器这些东西,略过不表。通常用如下方法构造一个map: Map<string, int> mapEmployeeSalary;

    三.数据的插入 第一种:用insert函数插入pair数据 Map<string, int> mapEmployeeSalary; mapEmployeeSalary.insert(pair<string, int>("ooxx",1000)); 第二种:用insert函数插入value_type数据 Map<string, int> mapEmployeeSalary; mapEmployeeSalary.insert(map<string, int>::value_type("ooxx",1000)); 第三种:用数组方式插入数据 map<string, int> mapEmployeeSalary; mapEmployeeSalary["ooxx"] =  1; map<string, string> mapTest mapTest["ooxx"] =  "one";

    用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值,用程序说明 mapEmployeeSalary.insert(map<string, int>::value_type(“ooxx”, 1000)); mapEmployeeSalary.insert(map<string, int>::value_type(“ooxx”, 2000)); 结果key=“ooxx”,valude=1000;

    mapEmployeeSalary["ooxx"] =  1000; mapEmployeeSalary["ooxx"] =  2000; 结果key=“ooxx”,valude=2000;

    insert函数可以通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。 pair<map<int, string>::iterator, bool> insert_result; insert_result = mapEmployeeSalary.insert(map<string, int>::value_type (“ooxx”, 1000)); if(insert_result.second == true) {     cout<<”Insert Successfully”<<endl; }    else {     cout<<”Insert Failure”<<endl; }

    四.map的大小 int nSize = mapEmployeeSalary.size();

    五.数据的遍历 map<string, int> mapEmployeeSalary; mapEmployeeSalary["student_one"] =  1; mapEmployeeSalary["student_two"] =  2; mapEmployeeSalary["student_three"] =  3;

    第一种:应用前向迭代器 map<string, int>::iterator  iter; for(iter = mapEmployeeSalary.begin(); iter != mapEmployeeSalary.end(); iter++) {     cout<<iter->first<<"   "<<iter->second<<endl; } 第二种:应用反相迭代器 map<int, string>::reverse_iterator  riter; for(riter = mapEmployeeSalary.rbegin(); riter != mapEmployeeSalary.rend(); riter++) {     cout<<riter->first<<"   "<<riter->second<<end; } 第三种:用数组方式 map<int, string> mapteacher; int nSize = mapteacher.size() for(int nIndex = 0; nIndex < nSize; nIndex++) {     cout<<mapteacher[nIndex]<<end; }

    六.数据的查找 第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了

    第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器,程序说明 Map<string, int> mapEmployeeSalary; mapEmployeeSalary.insert(pair<string, int>("ooxx", 1000)); map<String, int>::iterator iter; iter = mapEmployeeSalary.find("ooxx"); if(iter != mapEmployeeSalary.end()) {     cout<<”Find, the value is ”<<iter->second<<endl; } else {     cout<<”Do not Find”<<endl; } 七.数据的清空与判空 清空map中的数据可以用clear()函数,判定map中是否有数据可以用empty()函数,它返回true则说明是空map。

    八. 数据的删除 这里要用到erase函数,它有三个重载了的函数 Map<string, int> mapEmployeeSalary; mapEmployeeSalary.insert(pair<string, int>("ooxx", 1000)); mapEmployeeSalary.insert(pair<string, int>("ppmm", 1000)); map<String, int>::iterator iter; //如果要删除ooxx,用迭代器删除 iter = mapEmployeeSalary.find("ooxx"); mapEmployeeSalary.erase(iter); //如果要删除ooxx,用关键字删除 int n = mapEmployeeSalary.erase("ooxx");//如果删除了会返回1,否则返回0 //用迭代器,成片的删除 mapEmployeeSalary.earse(mapEmployeeSalary.begin(), mapEmployeeSalary.end()); //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合

    九.其他一些函数用法 这里有swap,key_comp,value_comp,get_allocator等函数,有兴趣的话可以自己研究


    最新回复(0)