c++ map使用(增删查改遍历)

本文实现数字计数并介绍map的增删查改遍历实现.

首先上增删查改遍历的代码

#include <iostream>
#include<map>
#include<set>
using namespace std;
int main()
{
    int numList[6]={1,2,2,3,3,3};
    map<int,int> numCountMap;
    //1.map add useage,insert into map four way
    for(int i=0;i<6;i++)
    {
        int numName=numList[i];
        int thisAddTime=1;
//        //1.1
//        numCountMap.insert({numName,thisAddTime});
//        //1.2
//        numCountMap.insert(make_pair(numName,thisAddTime));
        //1.3
         pair<map<int,int>::iterator,bool> ret=numCountMap.insert(pair<int,int>(numName,thisAddTime));
         if(!ret.second)
         {
             ++ret.first->second;
         }
//        //1.4
//        numCountMap.insert(map<int,int>::value_type(numName,thisAddTime));

    }

    //2.map traverse useage ,two way
    //2.1 way one
    for(map<int,int>::iterator it=numCountMap.begin() ;it!=numCountMap.end();it++)
    {
        cout<<it->first<<" occurs "<<it->second<<" times"<<endl;
    }
//    //2.1 way two ,c11 useage
//    for(const auto &it : numCountMap)
//    {
//        cout<<it.first<<" occurs "<<it.second<<" times"<<endl;
//    }

    //3.1 find useage
    int findNum=1;
    if(numCountMap.find(findNum)!=numCountMap.end())
    {
        cout<<"find num "<<findNum<<endl;
    }else{
        cout<<"do not find num "<<findNum<<endl;
    }

    //4.1 delete useage
    int eraseReturn=numCountMap.erase(1);
    if(1==eraseReturn)
    {
          cout<<"erase num 1 success"<<endl;
    }else{
        cout<<"erase failed,erase num not in map"<<endl;
    }

    for(map<int,int>::iterator it=numCountMap.begin() ;it!=numCountMap.end();it++)
    {
        cout<<it->first<<" occurs "<<it->second<<" times"<<endl;
    }

    //5.1 alter value useage
    int alterNum=3;
    map<int,int>::iterator alterit=numCountMap.find(alterNum);
    if(alterit!=numCountMap.end())
    {
        alterit->second=6;
        cout<<"alter num 3 occurs 6 time"<<endl;
    }
    for(map<int,int>::iterator it=numCountMap.begin() ;it!=numCountMap.end();it++)
    {
        cout<<it->first<<" occurs "<<it->second<<" times"<<endl;
    }
    return 0;
}

结果如下

这里写图片描述
以下是代码解析

1.增加元素

(1)insert增加元素的四种形式

numCountMap.insert({numName,thisAddTime});
numCountMap.insert(make_pair(numName,thisAddTime));
numCountMap.insert(pair<int,int>(numName,thisAddTime));
numCountMap.insert(map<int,int>::value_type(numName,thisAddTime));

(2)插入规则
注意,map包含不重复的关键字,此例子中关键字是numName,
因此插入一个已经存在的元素对容器没有影响.
如对于关键字1插入两次,即调用以下代码

numCountMap.insert({1,1});
numCountMap.insert({1,2});

会发现容器中的pair元素的值为{1,1},第二次插入对容器没有影响.
(3)insert返回值
此例insert返回值是

  pair<map<int,int>::iterator,bool> 

insert返回值是pair
pair 的first成员是迭代器,指向具有给定关键字的元素,second成员是一个bool值,指出元素是插入成功还是已经存在于容器中.如果关键字存在于容器中,insert什么都不做,且返回值中的bool 部分为false;
(4)插入注意
map 中使用一个不存在的关键字作为下标时会插入一个给定关键字的元素
因此如下也可以插入元素

numCountMap[numName]thisAddTime

2.遍历

遍历使用迭代器遍历,有两种形式,c++11使用auto 作为迭代器,如下

   //2.1 way one
    for(map<int,int>::iterator it=numCountMap.begin() ;it!=numCountMap.end();it++)
    {
        cout<<it->first<<" occurs "<<it->second<<" times"<<endl;
    }
    //2.1 way two ,c++11 useage
    for(const auto &it : numCountMap)
    {
        cout<<it.first<<" occurs "<<it.second<<" times"<<endl;
    }

3.查找

由于map 中使用一个不存在的关键字作为下标时会插入一个给定关键字的元素,因此查找是否有某个元素一定要使用find方法,否则使用下标操作会插入一个新元素.

    map<int,int>::iterator it=numCountMap.find(alterNum);

find 返回一个迭代器,如果查找失败会返回end()元素,否则成功

4.删除

erase的返回值总是0和1,若返回0,表示删除的元素不在map中

int eraseReturn=numCountMap.erase(1);

5 修改和访问

由于map 中使用一个不存在的关键字作为下标时会插入一个给定关键字的元素
因此修改元素的时候不直接用下标操作
通过先查找得到指向元素的迭代器, 然后直接赋值
如下例子

    int alterNum=3;
    map<int,int>::iterator alterit=numCountMap.find(alterNum);
    if(alterit!=numCountMap.end())
    {
        alterit->second=6;
        cout<<"alter num 3 occurs 6 time"<<endl;
    }

参考文献
c++ primer 第5版

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值