您的位置:首页 > 其它

map使用

2016-06-22 00:43 120 查看

一、

Map是c++的一个标准容器,它提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!
1. map构造函数;
map<string , int >mapstring; map<int ,string >mapint;

map<sring, char>mapstring; map< char ,string>mapchar;

map<char ,int>mapchar; map<int ,char >mapint;

如在打枚举中打印 “指定值对应的字符串”时,可是采用map<int, string>的STL实现。

以前我们是这样打印信息出来的:

[cpp]
view plain
copy

static inline const char *   
VNET_TYPE_STRING(vnet_type_t type)  
{  
    static VALUE_STRING_STRUCT g_type_string[] =  
    {  
        { VNET_TYPE_UNKOWN, "unkown1" },  
        { VNET_TYPE_SOCKET, "socket" },  
        { VNET_TYPE_RDP,    "rdp" },  
        { VNET_TYPE_PCOIP,  "pcoip" },  
        { VNET_TYPE_ICA, "ica" },  
        { VNET_TYPE_XRED, "xred" },  
        { 0, NULL },  
    };  
    return GetValueString(g_type_string, (ULONG)type);  
}  

[cpp]
view plain
copy

static inline const TCHAR *  
GetValueString(VALUE_STRING_STRUCT *vsarray, ULONG value)  
{  
    VALUE_STRING_STRUCT *tmp = vsarray;  
  
    while ( tmp->string != NULL )  
    {  
        if ( tmp->value == value )  
        {  
            return tmp->string;  
        }  
        tmp++;  
    }  
    return _T("unkown");  
}  

 

2. map添加数据;
map<int ,string> maplive;

1.maplive.insert(pair<int,string>(102,"aclive"));

2.maplive.insert(map<int,string>::value_type(321,"hai"));

3, maplive[112]="April";//map中最简单最常用的插入添加!

3,map中元素的查找:

find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。

map<int ,string >::iterator l_it;;

l_it=maplive.find(112);

if(l_it==maplive.end())

cout<<"we do not find 112"<<endl;

else cout<<"wo find 112"<<endl;

4,map中元素的删除:
如果删除112;

map<int ,string >::iterator l_it;;

l_it=maplive.find(112);

if(l_it==maplive.end())

cout<<"we do not find 112"<<endl;

else maplive.erase(l_it); //delete 112;

 

5,map中 swap的用法:
Map中的swap不是一个容器中的元素交换,而是两个容器交换;

For example:

[cpp]
view plain
copy

#include <map>  
#include <iostream>  
  
using namespace std;  
  
  
int main( )  
{  
    map <int, int> m1, m2, m3;  
    map <int, int>::iterator m1_Iter;  
  
    m1.insert ( pair <int, int> ( 1, 10 ) );  
    m1.insert ( pair <int, int> ( 2, 20 ) );  
    m1.insert ( pair <int, int> ( 3, 30 ) );  
    m2.insert ( pair <int, int> ( 10, 100 ) );  
    m2.insert ( pair <int, int> ( 20, 200 ) );  
    m3.insert ( pair <int, int> ( 30, 300 ) );  
  
    cout << "The original map m1 is:";  
    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )  
        cout << " " << m1_Iter->second;  
    cout << "." << endl;  
  
    // This is the member function version of swap  
    //m2 is said to be the argument map; m1 the target map  
    m1.swap( m2 );  
  
    cout << "After swapping with m2, map m1 is:";  
    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )  
        cout << " " << m1_Iter -> second;  
    cout << "." << endl;  
    cout << "After swapping with m2, map m2 is:";  
    for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ )  
        cout << " " << m1_Iter -> second;  
    cout << "." << endl;  
    // This is the specialized template version of swap  
    swap( m1, m3 );  
  
    cout << "After swapping with m3, map m1 is:";  
    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )  
        cout << " " << m1_Iter -> second;  
    cout << "." << endl;  
  
    system("pause");  
}  

运行结果是:



6.map的sort问题:
Map中的元素是自动按key升序排序,所以不能对map用sort函数:

For example:

[cpp]
view plain
copy

#include <map>  
#include <iostream>  
  
using namespace std;  
  
  
int main( )  
{  
map <int, int> m1;  
map <int, int>::iterator m1_Iter;  
  
m1.insert ( pair <int, int> ( 1, 20 ) );  
m1.insert ( pair <int, int> ( 4, 40 ) );  
m1.insert ( pair <int, int> ( 3, 60 ) );  
m1.insert ( pair <int, int> ( 2, 50 ) );  
m1.insert ( pair <int, int> ( 6, 40 ) );  
m1.insert ( pair <int, int> ( 7, 30 ) );  
  
cout << "The original map m1 is:"<<endl;  
for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )  
cout << m1_Iter->first<<" "<<m1_Iter->second<<endl;  
  
}  



7, 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的函数



二、C++中map用法

[cpp]
view plain
copy

/************************************************************************ 

* Map的特点: 1、存储Key-value对 
* 2、支持快速查找,查找的复杂度基本是Log(N) 
* 3、快速插入,快速删除,快速修改记 

/************************************************************************/  
#include <iostream>  
#include <string>  
#include <map>   
using namespace std;  
  
  
int main()  
{  
    map<const char*,int> m;  
    m["a"]=1;  
    m["b"]=6;  
    m["c"]=9;  
    map<const char*,int>::iterator it;  
    it=m.begin();  
    const char* c =it->first;  
    cout<<"first element is :"<<c<<endl;  
    int i = m["c"];  
    while(it!=m.end()){  
        cout << it->first<<";"<<it->second<<endl;  
        ++it;  
    }  
    cout <<"m[\"c\"]="<<i<<endl;  
    cout <<"sizeof m:"<<m.size()<<endl;  
    cout <<"erase m[\"c\"](1:succ 0:failed):"<<m.erase("c")<<endl;  
    cout <<"erase m[\"c\"]:"<<m.erase("c")<<endl;  
    cout <<"sizeof m:"<<m.size()<<endl;  
    cout<<"m[c]="<<m["c"]<<endl;  
    cout<<"sizeof m :"<<m.size()<<endl;  
  
    system("pause");  
    return 0;  
  
}  

 



请注意上面打感叹号的地方,map的大小因此调用了“cout<<"m[c]="<<m["c"]<<endl;”而增加了1个。这点真的另人很奇怪。!!!!

 

 

三、multimap 的使用方法

 

[cpp]
view plain
copy

/* 
 * 
 ******************************************** 
 *  multimap多重映照容器的基础说明: 
 ******************************************** 
 * 
 * multimap多重映照容器:容器的数据结构采用红黑树进行管理 
 * multimap的所有元素都是pair:第一元素为键值(key),不能修改;第二元素为实值(value),可被修改 
 * 
 * multimap特性以及用法与map完全相同,唯一的差别在于: 
 * 允许重复键值的元素插入容器(使用了RB-Tree的insert_equal函数)  
 * 因此: 
 * 键值key与元素value的映照关系是多对多的关系 
 * 没有定义[]操作运算  
 *  
 * Sorted Associative Container  Pair Associative Container   Unique Associative Container 
 * 
 * 使用multimap必须使用宏语句#include <map>           
 * 
 ************************************************************************************** 
 * 
 * 创建multimap对象: 
 * 1.multimap<char,int,greater<char> > a;    //元素键值类型为char,映照数据类型为int,键值的比较函数对象为greater<char> 
 * 2.multimap(const key_compare& comp)     //指定一个比较函数对象comp来创建map对象 
 *  3.multimap(const multisetr&);      //multimap<int,char*> b(a); //此时使用默认的键值比较函数less<int> 
 * 4.multimap(first,last);          
 * 5.multimap(first,last,const key_compare& comp);   
 * 
 * //Example: 
 * pair<const int ,char> p1(1,'a'); 
 * pair<const int ,char> p2(2,'b'); 
 * pair<const int ,char> p3(3,'c'); 
 * pair<const int ,char> p4(4,'d'); 
 * pair<const int ,char> pairArray[]={p1,p2,p3,p4}; 
 * multimap<const int,char> m4(pairArray,pairArray+5); 
 * multimap<const int,char> m3(m4); 
 * multimap<const int,char,greater<const int> > m5(pairArray,pairArray+5,greater<const int>()); 
 * 
 ************************************************************************************** 
 * 
 * 元素的插入 
 * //typedef pair<const key,T> value_type; 
 * pair<iterator,bool> insert(const value_type& v);     
 * iterator insert(iterator pos,const value_type& v); 
 * void insert(first,last); 
 * 
 ************************************************************************************** 
 * 
 * 元素的删除 
 * void erase(iterator pos); 
 * size_type erase(const key_type& k);     //删除等于键值k的元素 
 * void erase(first,last);        //删除[first,last)区间的元素 
 * void clear(); 
 * 
 ************************************************************************************** 
 * 
 * 访问与搜索 
 * 
 * iterator begin();iterator end();     //企图通过迭代器改变元素是不被允许的 
 * reverse_iterator rbegin();reverse_iterator rend(); 
 * 
 * iterator find(const key_type& k) const; 
 * pair<iterator,iterator> equal_range(const key_type& k) const;//返回的pair对象, 
 *                //first为lower_bound(k);大于等于k的第一个元素位置 
 *                //second为upper_bound();大于k的第一个元素位置 
 * 
 * 其它常用函数 
 * bool empty() const; 
 * size_type size() const; 
 * size_type count(const key_type& k) const;   //返回键值等于k的元素个数 
 * void swap(); 
 * 
 * iterator lower_bound();iterator upper_bound();pair<iterator,iterator> equal_range();//上界、下届、确定区间 
 * 
 * 
 * 
 ******************************************** 
 **   cumirror ** tongjinooo@163.com **    ** 
 ******************************************** 
 * 
 */  
  
#include <map>  
#include <string>  
#include <iostream>  
  
// 基本操作与set类型,牢记map中所有元素都是pair  
// 对于自定义类,初学者会觉得比较函数如何构造很麻烦,这个可以参照前面的书写示例  
// 但若设置键值为int或char类型,无须构造比较函数  
  
struct student{  
 char* name;  
 int age;  
 char* city;  
 char* phone;  
};  
  
int main()  
{  
     using namespace std;  
  
     student s[]={  
      {"童进",23,"武汉","XXX"},  
      {"老大",23,"武汉","XXX"},  
      {"饺子",23,"武汉","XXX"},  
      {"王老虎",23,"武汉","XXX"},  
      {"周润发",23,"武汉","XXX"},  
      {"周星星",23,"武汉","XXX"}  
     };  
      pair<int,student> p1(4,s[0]);  
      pair<int,student> p2(2,s[1]);  
      pair<int,student> p3(3,s[2]);  
      pair<int,student> p4(4,s[3]);  //键值key与p1相同  
      pair<int,student> p5(5,s[4]);  
      pair<int,student> p6(6,s[5]);  
     multimap<int,student> a;  
     a.insert(p1);  
     a.insert(p2);  
     a.insert(p3);  
     a.insert(p4);  
     a.insert(p5);  
     a.insert(p6);  
     typedef multimap<int,student>::iterator int_multimap;  
     pair<int_multimap,int_multimap> p = a.equal_range(4);  
     int_multimap i = a.find(4);  
     cout<<"班上key值为"<< i->first<<"的学生有:"<<a.count(4)<<"名,"<<"   他们是:"<<endl;  
     for(int_multimap k = p.first; k != p.second; k++)  
     {  
        cout<<k->second.name<<endl;  
     }  
     cout<<"删除重复键值的同学"<<endl;  
     a.erase(i);  
     cout<<"现在班上总人数为:"<<a.size()<<".   人员如下:"<<endl;  
     for(multimap<int,student>::iterator j=a.begin(); j != a.end(); j++)  
     {        
          cout<<"The name: "<<j->second.name<<"      "<<"age: "<<j->second.age<<"   "  
           <<"city: "<<j->second.city<<"      "<<"phone: "<<j->second.phone<<endl;  
     }  
  
     return 0;  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: