映射:map(STL-4)

简介:

map就是从键(key)到值(value)的映射。因为重载了[]运算符,map像是数组的“高级版”。例如可以用一个map<string,int>month name来表示“月份名字和月份编号”的映射,然后可以用month_name[July]=7这样的方式来赋值。

例题 反片语(Ananagrams)

输入一些单词,找出满足如下条件的单词:该单词不能通过字母重排,得到文本中的另一个单词。在判断是否满足条件时,字母不分大小写,但在输出是应保留输入中的大小写,按字典序进行排序(所有大写字母在所有小写字母的前面)。

样例输入:

ladder came tape soon leader acme RIDE lone Dreis peat
ScAlE orb eye Rides dealer NotE derail LaCes drIed noel dire Disk mace Rob dries

样例输出:

Disk    NotE    derail    drIed    eye    ladder    soon

编码的思考过程:

1.写一个标准化函数(实现大写字母转哈维小写字母),单词排序,注意使用const是为了不改变s的初值;

2.两个vector容器(words,ans)一个map容器

       words存储所有的单词

       map存储便准化后对应单词以及出现的次数的值,相当于一个表格;

words经过查表map,把对应的符合值给ans;

3.输出


#include<iostream>

#include<string>

#include<cctype>

#include<vector>

#include<map>

#include<algorithm>

using namespace std;

 

map<string,int> cnt;

vector<string> words;

 

// 将单词s进行“标准化”

string repr(string s) {

  string ans = s;

  for(int i = 0; i < ans.length(); i++)

    ans[i] = tolower(ans[i]);//towler是一种函数,功能是把字母字符转换成小写,非字母字符不做处理

  sort(ans.begin(), ans.end());

  return ans;

}

 

int main() {

  int n = 0;

  string s;

  while(cin >> s) {

    if(s[0] == '#') break;

    words.push_back(s);//输入的单词添加到尾部

    string r = repr(s);//得到标准化之后的s

    if(!cnt.count(r)) cnt[r] = 0;//使用count,返回的是被查元素的个数。如果有,返回1,否则返回0

    cnt[r]++;

  }

  vector<string> ans;

  for(int i = 0; i < words.size(); i++)

    if(cnt[repr(words[i])] == 1) ans.push_back(words[i]);//如果单词不重复就放入长数组ans的尾部

  sort(ans.begin(), ans.end());//对ans内的所有单词元素排序后输出

  for(int i = 0; i < ans.size(); i++)

    cout << ans[i] << "\n";

  return 0;

}

分析:

如果没有良好的代码设计,是无法发挥STL的威力的。如果没有想到“标准化”这个思路,就很难用map简化代码

提示:

set头文件中的set和map头文件中的map分别是集合和映射。两者都支持insert、find、和remove操作,并且可以按照从大到小的顺序循环遍历其中的元素。map还提供了“[]”运算符,使得map可以像数组一样使用。事实上,map也称为“关联数组”。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值