zoukankan      html  css  js  c++  java
  • STL:map/multimap用法详解

    map/multimap    

    使用map/multimap之前要加入头文件#include<map>,map和multimap将key/value当作元素,进行管理。它们可根据key的排序准则自动将元素排序。multimap允许重复元素,map不允许重复元素。


    map和multimap内部的数据结构也是平衡二叉树。


        map和multimap根据元素的key自动对元素进行排序,要修改元素的key必须先删除拥有该key的元素,然后插入拥有新的key/value的元素。

    常用函数

    1.构造函数和析构函数    

    map m:创建空映射,不包含任何元素

    map m(op):以op为排序准则,产生一个空的map

    map m1(m2):复制c2中的元素到c1中

    map m(const value_type *first, const value_type* last):复制[first, last)之间元素构成新映射

    map m(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新映射。

    m.~set()销毁所有元素,释放内存

    multimap mm:创建空映射,不包含任何元素

    multimap mm(op):以op为排序准则,产生一个空的multimap

    multimap m1(m2):复制m2中的元素到m1中

    multimap m(const value_type *first, const value_type* last):复制[first, last)之间元素构成新映射

    multimap m(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新映射

    m.~multimap()销毁所有元素,释放内存

    1. #include "stdafx.h"  
    2. #include <iostream>  
    3. #include <map>  
    4.   
    5. using namespace std;  
    6.   
    7. bool fncomp (char lhs, char rhs) {return lhs<rhs;}  
    8.   
    9. struct classcomp {  
    10.     bool operator() (const char& lhs, const char& rhs) const  
    11.     {return lhs<rhs;}  
    12. };  
    13.   
    14. int main ()  
    15. {  
    16.     map<char,int> first;  
    17.   
    18.     first['a']=10;  
    19.     first['b']=30;  
    20.     first['c']=50;  
    21.     first['d']=70;  
    22.   
    23.     map<char,int> second (first.begin(),first.end());  
    24.   
    25.     map<char,int> third (second);  
    26.   
    27.     map<char,int,classcomp> fourth;                 // class as Compare  
    28.   
    29.     bool(*fn_pt)(char,char) = fncomp;  
    30.     map<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as Compare  
    31.   
    32.     return 0;  
    33. }  

    2.大小、判断空函数

        int size() const:返回容器元素个数
        bool empty() const:判断容器是否空,若返回true,表明容器已空。

    3.增加删除函数

        iterator insert(const value_type& x):插入元素x

        iterator insert(iterator it,const value_type& x):在迭代指针it处插入元素x
        void insert(const value_type *first,const value_type* last):插入[first, last)之间元素

        iterator erase(iterator it):删除迭代指针it处元素

        iterator erase(iterator first,iterator last):删除[first, last)之间元素

        size_type erase(const Key& key):删除键值等于key的元素

    1. #include "stdafx.h"  
    2. #include <iostream>  
    3. #include <map>  
    4.   
    5. using namespace std;  
    6.   
    7.   
    8. int main ()  
    9. {  
    10.     map<char,int> mymap;  
    11.   
    12.     mymap.insert(pair<char,int>('a',10));  
    13.     mymap.insert(pair<char,int>('z',200));  
    14.   
    15.     pair<map<char,int>::iterator,bool> ret;  
    16.     ret = mymap.insert(pair<char,int>('z',500));  
    17.     if (ret.second == false)  
    18.     {  
    19.         cout<<"element 'z' already existed";  
    20.         cout<<"with a value of "<<ret.first->second<<' ';  
    21.     }  
    22.   
    23.     map<char,int>::iterator it = mymap.begin();  
    24.     mymap.insert(it,pair<char,int>('b',300));  
    25.     mymap.insert(it,pair<char,int>('c',400));  
    26.   
    27.     map<char,int> anothermap;  
    28.     anothermap.insert(mymap.begin(),mymap.find('c'));  
    29.   
    30.     cout<<"mymap contains : ";  
    31.     for (it = mymap.begin();it!= mymap.end();it++)  
    32.     {  
    33.         cout<<it->first<<"=>"<<it->second<<' ';  
    34.     }  
    35.   
    36.     cout<<"anothermap contains : ";  
    37.     for (it = anothermap.begin();it!= anothermap.end();it++)  
    38.     {  
    39.         cout<<it->first<<"=>"<<it->second<<' ';  
    40.     }  
    41.     return 0;  
    42. }  
    上述代码运行结果为

    1. #include "stdafx.h"  
    2. #include <iostream>  
    3. #include <map>  
    4.   
    5. using namespace std;  
    6.   
    7.   
    8. int main ()  
    9. {  
    10.     map<char,int> mymap;  
    11.     map<char,int>::iterator it;  
    12.       
    13.     mymap['a'] = 10;  
    14.     mymap['b'] = 20;  
    15.     mymap['c'] = 30;  
    16.     mymap['d'] = 40;  
    17.     mymap['e'] = 50;  
    18.     mymap.insert(pair<char,int>('f',60));  
    19.   
    20.     cout<<"initial mymap contains : ";  
    21.     for (it = mymap.begin();it!= mymap.end();it++)  
    22.     {  
    23.         cout<<it->first<<"=>"<<it->second<<' ';  
    24.     }  
    25.   
    26.     it = mymap.find('b');  
    27.     mymap.erase(it);  
    28.   
    29.     mymap.erase('c');  
    30.   
    31.     it = mymap.find('e');  
    32.     mymap.erase(it,mymap.end());  
    33.   
    34.     cout<<"now mymap contains : ";  
    35.     for (it = mymap.begin();it!= mymap.end();it++)  
    36.     {  
    37.         cout<<it->first<<"=>"<<it->second<<' ';  
    38.     }  
    39.   
    40.     return 0;  
    41. }  

    上述代码运行结果为:


    如果想往map/multimap中修改一个映射的值,应先插入一个新映射,再把与修改的映射删除。

    4.遍历函数    

        iterator begin():返回首元素的迭代器指针

        iterator end():返回尾元素的迭代器指针

        reverse_iterator rbegin():返回尾元素的逆向迭代器指针

        reverse_iterator rend():返回首元素前一个位置的迭代器指针

    5.操作函数   

        const_iterator lower_bound(const Key& key):返回键值大于等于key的迭代器指针
        const_iterator upper_bound(const Key& key):返回键值大于key的迭代器指针
        int count(const Key& key) const:返回键值等于key的元素的个数
        pair<const_iterator,const_iterator> equal_range(const Key& key) const:返回容器中键值等于key的迭代指针[first, last)
        const_iterator find(const Key& key) const:查找功能,返回键值等于key的迭代器指针
        void swap(set& s):交换但映射元素
        void swap(multiset& s):交换多映射元素  

    6.特殊函数

        reference operator[](const Key& k):仅在但映射map类中,可以以数组的形式给映射添加键-值对,并可返回值的引用。

  • 相关阅读:
    UVA 213 Message Decoding 【模拟】
    HDU 5976 Detachment 【贪心】 (2016ACM/ICPC亚洲区大连站)
    HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)
    HDU 5963 朋友 【博弈论】 (2016年中国大学生程序设计竞赛(合肥))
    HDU 5969 最大的位或 【贪心】 (2016年中国大学生程序设计竞赛(合肥))
    HDU 5968 异或密码 【模拟】 2016年中国大学生程序设计竞赛(合肥)
    HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))
    HDU 5965 扫雷 【模拟】 (2016年中国大学生程序设计竞赛(合肥))
    HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
    HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
  • 原文地址:https://www.cnblogs.com/wangfengju/p/6172883.html
Copyright © 2011-2022 走看看