• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

技术天地

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

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/2019/1117/697.html

 
 
 
 
本文实现数字计数并介绍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
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
10
 
11
 
12
 
13
 
14
 
15
 
16
 
17
 
18
 
19
 
20
 
21
 
22
 
23
 
24
 
25
 
26
 
27
 
28
 
29
 
30
 
31
 
32
 
33
 
34
 
35
 
36
 
37
 
38
 
39
 
40
 
41
 
42
 
43
 
44
 
45
 
46
 
47
 
48
 
49
 
50
 
51
 
52
 
53
 
54
 
55
 
56
 
57
 
58
 
59
 
60
 
61
 
62
 
63
 
64
 
65
 
66
 
67
 
68
 
69
 
70
 
71
 
72
 
73
 
74
 
75
 
76
 
77
 
78
 
79
 
 
 
以下是代码分析
 
 
 
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));
 
1
 
2
 
3
 
4
 
(2)插入准则
 
留意,map包括不重复的环节字,此例子中环节字是numName,
 
是以插入一个曾经存在的元素对容器没有影响.
 
如关于环节字1插入两次,即挪用以下代码
 
 
 
numCountMap.insert({1,1});
 
numCountMap.insert({1,2});
 
1
 
2
 
会发现容器中的pair元素的值为{1,1},第二次插入对容器没有影响.
 
(3)insert回笼值
 
此例insert回笼值是
 
 
 
  pair<map<int,int>::iterator,bool> 
 
1
 
insert回笼值是pair
 
pair 的first成员是迭代器,指向具有给定环节字的元素,second成员是一个bool值,指出元素是插入胜利或是曾经存在于容器中.如果环节字存在于容器中,insert甚么都不做,且回笼值中的bool 片面为false;
 
(4)插入留意
 
map 中应用一个不存在的环节字作为下标时会插入一个给定环节字的元素
 
是以以下也能够插入元素
 
 
 
numCountMap[numName]=thisAddTime;
 
1
 
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;
 
    }
 
1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
10
 
3.查找
 
 
 
由于map 中应用一个不存在的环节字作为下标时会插入一个给定环节字的元素,是以查找是否有某个元素必然要应用find技巧,不然应用下标操纵会插入一个新元素.
 
 
 
    map<int,int>::iterator it=numCountMap.find(alterNum);
 
1
 
find 回笼一个迭代器,如果查找失利会回笼end()元素,不然胜利
 
 
 
4.删除
 
 
 
erase的回笼值总是0和1,若回笼0,显露删除的元素不在map中
 
 
 
int eraseReturn=numCountMap.erase(1);
 
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;
 
    }
 

上篇:上一篇:Qt5_vs2013_error_C2001: 常量中有换行符
下篇:下一篇:没有了