C++ map

c++ map学习

一.map简介

map是一类关联式容器,模板类。其增加和删除节点对迭代器影响很小,不能修改其key,但可以修改其value。

二.map常用定义

map< string , int >mapstring;         map< int ,string >mapint;

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

三.map添加

1.使用下标操作符获取元素,然后给元素赋值
map< string, int> word_count;
word_count[“Anna”] = 1;
map< char,char> c2d;
c2d[‘A’]=’2’;
使用下标访问map与使用下标访问数组或者vector的行为是截然不同的:使用下标访问不存在的元素将导致在map容器中添加一个新的元素,他的键即为该下标值。
2.map容器提供的insert操作:

      1. map.insert(e) : e是一个用在map中的value_type类型的值。如果键不存在,则插入一个值为e.second的新元素;如果键在map中已经存在,那么不进行任何操作。该函数返回一个pair类型,该pair类型的first元素为当前插入e的map迭代器,pair的second类型是一个bool类型,表示是否插入了该元素。

      2. map.insert(beg, end) : beg和end是迭代器,返回void类型

      3. map.insert(iter, e) : e是value_type类型的值,如果e.first不在map中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置,返回一个迭代器,指向map中具有给定键的元素。

word_count.insert(map< string, int>::value_type(“Anna”, 1)); word_count.insert(make_pair(“Anna”, 1));
返回值:如果该键已在容器中,则其关联的值保持不变,返回的bool值为true。

四.查找并获取map中的元素

  1. 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;
    通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据
    1. map.count(k) : 返回map中键k的出现次数(对于map而言,由于一个key对应一个value,因此返回只有0和1,因此可以用此函数判断k是否在map中)

五.删除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());

六.map中的迭代

for (my_Itr=my_Map.begin(); my_Itr!=my_Map.end(); ++my_Itr) {}

七.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的函数
   可以直接进行赋值和比较:=,   >,   >=,   <,   <=,   !=   等等

八.multimap

//multimap允许重复的键值插入容器  
//        **********************************************************        
//        * pair只包含一对数值:pair<int,char>                       *  
//        * map是一个集合类型,永远保持排好序的,                   *  
//  pair  * map每一个成员就是一个pair,例如:map<int,char>           *  
//        * map的insert()可以把一个pair对象作为map的参数,例如map<p> *  
//        ***********************************************************  
#pragma warning(disable:4786)  
#include<map>  
#include<iostream>  
using namespace std;  

int main(void)  
{  
 multimap<int,char*> m;  
 //multimap的插入只能用insert()不能用数组  
 m.insert(pair<int,char*>(1,"apple"));  
    m.insert(pair<int,char*>(1,"pear"));//apple和pear的价钱完全有可能是一样的  
 m.insert(pair<int,char*>(2,"banana"));  
 //multimap的遍历只能用迭代器方式不能用数组  
 cout<<"***************************************"<<endl;  
 multimap<int,char*>::iterator i,iend;  
 iend=m.end();  
 for(i=m.begin();i!=iend;i++)  
 {  
  cout<<(*i).second<<"的价钱是"  
   <<(*i).first<<"元/斤\n";  
 }  
 cout<<"***************************************"<<endl;  
    //元素的反相遍历  
 multimap<int,char*>::reverse_iterator j,jend;  
 jend=m.rend();  
 for(j=m.rbegin();j!=jend;j++)  
 {  
  cout<<(*j).second<<"的价钱是"  
   <<(*j).first<<"元/斤\n";  
 }  
 cout<<"***************************************"<<endl;  
 //元素的搜索find(),pair<iterator,iterator>equal_range(const key_type &k)const  
    //和multiset的用法一样  
 multimap<int,char*>::iterator s;  
 s=m.find(1);//find()只要找到一个就行了,然后立即返回。  
 cout<<(*s).second<<"    "  
  <<(*s).first<<endl;  
 cout<<"键值等于1的元素个数是:"<<m.count(1)<<endl;  
 cout<<"***************************************"<<endl;  
 //删除 erase(),clear()  
 m.erase(1);  
    for(i=m.begin();i!=iend;i++)  
 {  
  cout<<(*i).second<<"的价钱是"  
   <<(*i).first<<"元/斤\n";  
 }  
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值