C++ 知识点4

C++ map的基本操作和用法


1、map简介


map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。


2、map的功能


自动建立Key - value的对应。key 和 value可以是任意你需要的类型。 
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。 
快速插入Key - Value 记录。 
快速删除记录 
根据Key 修改value记录。 
遍历所有记录。 
3、使用map


使用map得包含map类所在的头文件


#include <map> //注意,STL头文件没有扩展名.h


map对象是模板类,需要关键字和存储对象两个模板参数:


std:map<int, string> personnel;


这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.


为了使用方便,可以对模板类进行一下类型定义,


typedef map<int, CString> UDT_MAP_INT_CSTRING;


UDT_MAP_INT_CSTRING enumMap;


4、在map中插入元素


改变map中的条目非常简单,因为map类已经对[]操作符进行了重载


enumMap[1] = "One";


enumMap[2] = "Two";


.....


这样非常直观,但存在一个性能的问题。插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串,插入完成后,将字符串赋为"Two"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:


enumMap.insert(map<int, CString> :: value_type(2, "Two"))


5、查找并获取map中的元素


下标操作符给出了获得一个值的最简单方法:


CString tmp = enumMap[2];


但是,只有当map中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值。


我们可以使用Find()和Count()方法来发现一个键是否存在。


查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.


int nFindKey = 2; //要查找的Key


//定义一个条目变量(实际是指针)


UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);


if(it == enumMap.end()) {


//没找到


}


else {


//找到


}


通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据


6、从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());


C++ STL map的使用


以下是对C++中STL map的插入,查找,遍历及删除的例子:


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


void map_insert(map < string, string > *mapStudent, string index, string x) 

mapStudent->insert(map < string, string >::value_type(index, x)); 
}


int main(int argc, char **argv) 

char tmp[32] = ""; 
map < string, string > mapS;


//insert element 
map_insert(&mapS, "192.168.0.128", "xiong"); 
map_insert(&mapS, "192.168.200.3", "feng"); 
map_insert(&mapS, "192.168.200.33", "xiongfeng");


map < string, string >::iterator iter;


cout << "We Have Third Element:" << endl; 
cout << "-----------------------------" << endl;


//find element 
iter = mapS.find("192.168.0.33"); 
if (iter != mapS.end()) { 
cout << "find the elememt" << endl; 
cout << "It is:" << iter->second << endl; 
} else { 
cout << "not find the element" << endl; 
}


//see element 
for (iter = mapS.begin(); iter != mapS.end(); iter ) {


cout << "| " << iter->first << " | " << iter-> 
second << " |" << endl;



cout << "-----------------------------" << endl;


map_insert(&mapS, "192.168.30.23", "xf");


cout << "After We Insert One Element:" << endl; 
cout << "-----------------------------" << endl; 
for (iter = mapS.begin(); iter != mapS.end(); iter ) {


cout << "| " << iter->first << " | " << iter-> 
second << " |" << endl; 
}


cout << "-----------------------------" << endl;


//delete element 
iter = mapS.find("192.168.200.33"); 
if (iter != mapS.end()) { 
cout << "find the element:" << iter->first << endl; 
cout << "delete element:" << iter->first << endl; 
cout << "=================================" << endl; 
mapS.erase(iter); 
} else { 
cout << "not find the element" << endl; 

for (iter = mapS.begin(); iter != mapS.end(); iter ) {


cout << "| " << iter->first << " | " << iter-> 
second << " |" << endl;



cout << "=================================" << endl;


return 0; 
}






//-------------------------------------------




C++ map 使用
map常用成员(关联容器)----创建map<主键,主键对应的值>,增insert,删erase,改查找find,然后修改second,遍历iterator,获取元素个数size,判空empty  
 
        map是STL的一个关联容器,它提供一对一(第一个字段为关键字,每个关键字只能在map中出现一次,第二个字段称为该关键字的值)的数据处理能力,由于这个特性
        map内部的实现自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能。
头文件::
            #include <iostream>
            #include <map>
            using namespace std;
 
创建map对象::
           map<int ,string>    object;                       //map<主键,主键对应的值>
注意:
           在map<key,value>类型中对key的要求:
           因为map内部的实现采用的是一颗红黑树(类似平衡二叉树),所以,它要按照key值比较大小(弱排序),所以,对key类型的唯一要求是,它必须支持<操作,至于是否支持其他的关系或相等元算,不做要求。
          例如::  我们定义了一个类作为Key,那么必须让它支持<操作,否则是不可以的。
 
                                  增  insert     数组方式object[key_value] = value;
创建map的成员::
方法一、插入value_type          
         map<int,string>::value_type   value(1,"billchen");
         object.insert(value);
         也可以用   value.insert(map<int,string>::value_type(1,"billchen"));作用是一样的。   
方法二、插入pair或make_pair数据
         map<int,string>   object;
         object.insert(pair<int,string>(1,"billchen"));
         或者
         object.insert(make_pair(1,"billchen"));                    
         /*
                     其中pair是一个模板pair<T1,T2>  pvalue(v1,v2);表示创建一个pair对象,
            v1和v2的类型是T1和T2,值是v1和v2。
                     可以取出v1和v2的值,
                     分别是pvalue.first  为  v1
                                pvalue.second   为   v2
         */
         /*
            其中make_pair(v1,v2);表示以v1,v2创建一个新的pair对象,类型是v1和v2的类型。
             一般用在map的insert方法中,创建临时对象。
         */
方法三、数组方式
         map<int,string>    object;
         object[1]="billchen";         //object[key_value]=value;               (在key值对应的空间填写数据)
 
                                                 删  erase      clear
删除map中的一个元素,使用erase
方法一、通过迭代器删除         
         map<int,string>::iterator   iter = object.find(key);                    
         if(iter != object.end())
         {
                    object.erase(iter);                         
         }
方法二、通过key值删除
        object.erase(key);                   //删除成功,返回1,删除失败,返回0
删除map中的一段,如迭代器iter_begin到iter_end的元素:
        iter_begin = object.find(key_value1);
        iter_end = object.find(key_value2);
        if(iter_begin != object.end() && iter_end != object.end())
        {
                object.erase(iter_begin,iter_end);
        }
删除所有元素使用erase:
方法一、使用迭代器,遍历删除          
          map<int,string>::iterator iter=object.begin();
          while(iter!=object.end())
          {
                       object.erase(iter++);    //这样做,是为了防止迭代器失效。
          }
方法二、调用clear接口
         object.clear();
                                           改   (修改map中成员的值)
修改map中成员的值(迭代器):
          map<int,string>::iterator   iter = object.find(key);
          iter->second="wang";
修改map中成员的值(数组方式):
         map[key] = "wang";
例如:
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(int argc,char *argv[])
{
        int i;
        map<char,string> obj;
        map<char,string>::value_type mem1('a',"billchen");
        obj.insert(mem1);
        map<char,string>::iterator iter = obj.begin();
        while(iter != obj.end())       //修改
        {   
                iter->second="wang";
                iter++;
        }   
        iter=obj.begin();
        while(iter != obj.end())        //遍历
        {   
                cout << iter->first << endl;
                cout << iter->second << endl;
                iter++;
        }   
        return 0;
}
                                                    查   find
查找使用find(主键);
       object.find(主键);
       返回值为iterator(迭代器),
       if(object.find(主键) == object.end())
       {
                 cout << "没有找到" <<endl;
       }
 
                                                   遍历
遍历方法1:    通过迭代器
         map<int,string>::iterator iter=object.begin(); 
          while(iter!=object.end())
          {
                       cout<<iter->first<<iter->second等等<<endl;
                       iter++;
         }
适当的情况下,可以使用数组的方式来进行map的遍历。
 
                                  获取map中成员的个数  size()
获取map中元素的个数:
          map<int,string> obj;
          map<int,string>::value_type mem1(1,"billchen");
          map<int,string>::value_type mem2(2,"chenbaihu");
          obj.insert(mem1);
          obj.insert(mem2);
          cout << obj.size() <<endl;
 
                          判断map是否为空,使用empty                                                 
为空,返回true,不为空,返回false;










//-------------------------------------------


C++ map的基本操作和使用




 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;
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:
  #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;
}
6.map的sort问题:
  Map中的元素是自动按key升序排序,所以不能对map用sort函数:
  For example:
  #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;
  
}
  The original map m1 is:
  1 20
  2 50
  3 60
  4 40
  6 40
  7 30
  请按任意键继续. . .
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的函数
                                                          


//------------------------------------------------------

































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值