zoukankan      html  css  js  c++  java
  • acm的STL容器之Map篇

    1.对map的简单介绍

     Map是STL的一个关联容器,它提供一对一(其中第一个称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值)的数据处理能力。

    这里说下map内部数据的组织,map内部自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

    2.map功能介绍

     map利用k-v,即Key - value。key 和 value可以声明成任意你需要的类型。

    查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。

    map的常用操作:

    快速插入Key -Value 记录。

    快速删除记录

    根据Key 修改value记录。

    遍历所有记录。

    3.map的声明

     需要声明头文件,并使用命名空间std。

    #include<iostream>
    #include<map>
    using namespace std;
    

      声明一个map。根据个人命名规范习惯,推荐int-int类型的map叫 iimap,如果是<int,string>类型的推荐叫 ismap

    一半声明了map后,为了以后查询、遍历、删除等方便,我们顺便声明iterator

    map<int,int> iimap;
    map<int,int>::iterator iter;

      

    4.数据的插入、删除、数量、清空

     先不写查询,放在遍历那里一起写。

    有2种方法可以向map中填入数据,第一种是用类似数组的方式。

    ismap[1] = "hello";
    

     这样,字符串“hello”的key就是1.

    还有一种是

    iimap.insert(pair<int,int>(a,b));
    

     (我这里使用的第一个是<int,string>,第二个是<int,int>)

    这两种方式有区别,第一种数组的方法可以覆盖重复key值的value,第二种插入时若key已经存在,则插入无效。

    当然,第二种方法可以用pair来查询数据是否插入成功(acm中通常不使用),这里给代码,不作详解。

     1   map<int, string> ismap;  
     2   
     3     pair<map<int, string>::iterator, bool> Insert_Pair;  
     4   
     5     Insert_Pair = ismap.insert(pair<int, string>(1, "hello"));  
     6   
     7     if(Insert_Pair.second == true)  
     8   
     9         cout<<"Insert Successfully"<<endl;  
    10   
    11     else  
    12   
    13         cout<<"Insert Failure"<<endl;  

    数据数量查询(map中数据样本多少)

    iimap.size();
    

    清空map的操作

    iimap.clear();
    

    从map中删除特定元素

    移除某个map中某个条目用erase()

    该成员方法的定义如下:

    iterator erase(iterator it);//通过一个条目对象删除
    
    iterator erase(iterator first,iterator last)//删除一个范围
    
    size_type erase(const Key&key);//通过关键字删除
    

    刚才提到的clear()就相当于enumMap.erase(enumMap.begin(),enumMap.end());

    这里只演示删除某key值和其对应的value

    1 map<int, string>::iterator iter;  
    2   //第一种,通过iter删除 
    3        iter = ismap.find(1);  
    4   
    5        ismap.erase(iter);  
    6   
    7         //第二种,直接在erase()的括号中填入key,可以不用n,只是删除不管返回值
    8        //这样的话会有一个返回值,这里用n来接收,删除了会返回1,否则返回0  
    9        int n = ismap.erase(1);

    5.数据的查询和遍历

    刚才的移除元素已经用到了iterator,接下来我们都要用。通常用第二种方法。

    查找一个元素是否存在的两种方式:

    第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置。

    由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了

    由于比赛中用得比较少,大家自行体会,代码就不放了。

    第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

    查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,

    分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.

    因为我们已经声明过iterator了,所以就方便很多,直接用iter=ismap.find(index)来查找,然后使用一个if语句来判断。

    1 iter = ismap.find(1);  
    2   //如果不存在则返回end(),所以如果!end()就是存在(iter->First是输出key,iter->second输出value)
    3     if(iter != ismap.end())  
    4   
    5        cout<<"Find, the value is "<<iter->second<<endl;  
    6   
    7     else  
    8   
    9        cout<<"Do not Find"<<endl;  

    个人感觉c++的容器搞得没java好,比较麻烦,好怀念containKey()这种操作。

    接下来是遍历,也是用iter就可以了。

    1 for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  {
    2   //第一种方法,直接使用iter 
    3         cout<<iter->first<<' '<<iter->second<<endl;  
    4   
    5 }  
     1 int ismapSize = ismap.size();  
     2  //第二种方法,数组法
     3 //注意,这里是 for(int i = 1; i <= ismapSize; i++)  
     4 //而不是 for(int i = 0; i < ismapSize; i++)  
     5   
     6     for(int i = 1; i <= ismapSize; i++){ 
     7   
     8         cout<<ismap[i]<<endl;  
     9   
    10 }  

    附上表:

      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有很多其他操作,但是在比赛中不常用,所以在这里不列举

    这里加上了我自己的理解和对知识的整理归纳,参考原文链接:https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html

  • 相关阅读:
    IOS小组件(8):App与Widget数据共享
    IOS小组件(7):小组件点击交互
    IOS小组件(6):小组件实现时钟按秒刷新
    IOS小组件(5):小组件刷新机制
    IOS小组件(4-2):创建可配置小组件(动态修改配置数据)
    IOS小组件(4-1):创建可配置小组件(静态配置数据)
    IOS小组件(3):SwiftUI开发小组件布局入门
    IOS小组件(2):小组件框架解析
    IOS小组件(1):概述
    python函数作用域
  • 原文地址:https://www.cnblogs.com/VsKendo/p/9305158.html
Copyright © 2011-2022 走看看