Map容器的使用总结

map简介

map是一类关联式容器,它是模板类。关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置类获取。它的特点是增加和删除节点对迭代器的影响很小,除了操作节点,对其他的节点都没有什么影响。对于迭代器来说,不可以修改键值,只能修改其对应的实值。

map操作函数

详细可以参考这篇博文:链接


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

map使用例子

一 、 数组中重复的数字
/*在一个长度为n的数组里的所有数字都在0到n-1的范围内。 
数组中某些数字是重复的,但不知道有几个数字是重复的。
也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 
例如,如果输入长度为7的数组{2,3,1,0,2,5,3},
那么对应的输出是重复的数字2或者3。*/
bool duplicate(int numbers[], int length, int* duplication) {
       map<int,int> mymap;
       map<int,int>::iterator iter;
       int i=0;
       while(i<length){
           iter=mymap.find(numbers[i]);
           if(iter==mymap.end())
               mymap[numbers[i]]=i;
           else{
               *duplication=numbers[i];
               return true;
           }
           ++i;
       }

        return false;
    }
};
二 、 统计每个单词在输入中出现的次数
//统计每个单词在输入中出现的次数
map<string, size_t> word_count;
string word;
while(cin>>word)
    ++word_count[word]; //统计出现的次数
for(const auto &w :word_count)
    //打印结果
    cout<<w.first<<"occurs"<<w.second<<((w.second>1) ? "times":"time")<<endl;
三 、leetcode 13 Roman to Integer
/*
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
*/

class Solution {
public:
    int romanToInt(string s) {
        map<char, int> dct;  
        dct['I'] = 1, dct['i'] = 1;  
        dct['V'] = 5, dct['v'] = 5;  
        dct['X'] = 10, dct['x'] = 10;  
        dct['L'] = 50, dct['l'] = 50;  
        dct['C'] = 100, dct['c'] = 100;  
        dct['D'] = 500, dct['d'] = 500;  
        dct['M'] = 1000, dct['m'] = 1000;  

        int sum = 0, j;  
        for(int i = 0; i < s.size(); ++i)  
        {  
            j = i+1;  

            if(j < s.size() && dct[s[j]] > dct[s[i]])  
            {  
                sum += dct[s[j]] - dct[s[i]];  
                i = j;  
            }  
            else  
                sum += dct[s[i]];  
        }  
        return sum;      
    }
};
四、 单词转换

例如
1. brb—–>be right back
2. k —–>okay?
3. y —–> why
4. r —–> are
5. u —–> you
6. pic —–>pictures
7. thk —–>thanks
8. 18r —–>later
假设输入为:
where r u
y dont u send me a pic
k thk 18r
则程序输出为:
where are you
why dont you send me a picture
okay? thanks! later

//读入给定文件,建立转换映射
map<string,string> buildMap (ifstream &map_file){
 mapmap<string,string> trans_map;//保存转换规则
 string key;//要转换的单词
 string value;//替换后的内容
 //读取第一个单词存入key中,行中剩余内容存入value中
 while(map_file>>key&&getline(map_file,value))
     if(value.size()>1)//检查是否有转换规则
         trans_map[key]=value.substr(1);//跳过前导空格
     else
         throw runtime_error("no rule for"+key);
return trans_map; 
}

//进行实际的转换工作
const string &transform(const string &s ,const map<string,string> &m){
//实际的转换工作,程序的核心
auto map_it =map.find(s);
//如果单词在转换规则map中
if(map_it != m.end())
    return map_it->second; //使用替换短语
else
    return s; //否则返回原短语
}

//单词转换程序
void word_tranform(ifstream &map_file ,ifstream &input){
    auto trans_map= buildMap(map_file); //保存转换规则
    string line;//保存读入的一行
    while(getline(input,line))//读取输入中的每一行
    {
        istringstream stream(line);
        string word;
        bool firstword=true;//控制是否打印空格  
        while(stream>>word)
        {            
            if(firstword)
                firstword=false;
            else
                cout<<" ";//在单词间打印一个空格
            cout<<transform(word,trans_map);//打印输出
        }
        cout<<endl; //完成一行的转换
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值