map(映射)的练习

文章描述了一位程序员在使用C++中map和迭代器处理字符串时,对无重复字母词的查找和排序过程。作者首先将输入的字符串转换为小写并按字典序排序,然后存储在map中,最后筛选出无重复字母的词并再次排序输出。
摘要由CSDN通过智能技术生成

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

来源:反片语(Ananagrams,Uva 156)

先说一句,我不是按照原题的输入样例写的,只是完成了上述的相应的功能

我map是上网学的(或许我应该去看我那本C++ Primer Plus),发现网上基本上都没说使用迭代器的时候,迭代器访问的顺序

在了解到map可以用迭代器后,我就产生了这个疑问,然后自己去试了下,发现他是把key值排序之后进行访问的(就是用[]访问的时候,[]里面的那个)然后心中一喜,那我不是不用自己排序?

最后发现不是这样的,因为我key值是标准化后的字符串:字符串全部转化为小写,然后按字典序排序

最后是把符合标准的字符串取出来放在vector里面,然后用sort函数排序的

代码如下:

#include<map>
#include<vector>
#include<cctype>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
string getWord(void);
void s_tolower(string &str1, string &str2);
map<string, vector<string>> dictionary;
vector<string> result;

int main(void)
{
    //输入并处理
    while(true)
    {
        string s_tmp1 = getWord(), s_tmp2;
        s_tolower(s_tmp1, s_tmp2);
        if(s_tmp1.empty())  break;
        auto it = dictionary.find(s_tmp2);
        if(it == dictionary.end())
        {
            vector<string> tmp;
            tmp.push_back(s_tmp1);
            dictionary[s_tmp2] = tmp;
        }
        else
            it->second.push_back(s_tmp1);
    }
    //去除不满足条件的字符串并对结果排序
    for(auto it = dictionary.begin(); it != dictionary.end(); it++)
        if(it->second.size() == 1)
            result.push_back(it->second[0]);
    sort(result.begin(), result.end());
    //输出
    for(auto it = result.begin(); it != result.end(); it++)
        printf("%s\n", (*it).c_str());
    
    return 0;
}
string getWord(void)
{
    char c;
    string str;
    while(!isalpha(c = getchar()))
        if(c == EOF)  return str;
    do
    {
        str.push_back(c);
    }while(isalpha(c = getchar()));
    ungetc(c, stdin);
    return str;
}
void s_tolower(string &str1, string &str2)
{
    for(int i = 0; i < str1.size(); i++)
        str2.push_back(tolower(str1[i]));
    sort(str2.begin(), str2.end());
    return;
}

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值