实现一个简单的代码字计数器(二)
- 分割字符串
- 实现一个简单的代码字计数器(一)
- 实现一个简单的代码字计数器(二)
- 实现一个简单的代码字计数器(三)
- 实现一个简单的代码字计数器(四)
这一篇里让我们先实现基本功能,特性和改善放在后几篇实现里面。
要使一个函数执行一段代码的单词计数,让我们从设计它的接口开始。我们考虑输出的形式应该是什么样的:输入为code文本,输出应该为单词:出现次数,这样的话用map实现:
std::map<std::string, size_t> getWordCount(std::string const& code);
但是为了以后的设计,因为我们肯定需要知道出现次数最大的单词,如果用map的话需要设置迭代器遍历,通过it->second
来判断大小,不够方便,所以这里采用vector来做可能更加妥当,因为之后还可以直接利用sort来进行排序操作:
std::vector<std::pair<std::string, size_t>> getWordCount(std::string const& code);
接下来要处理分隔符的问题,因为可能存在空格、逗号或者&&
,||
和->
这样的符号,所以需要通过分割字符串将这些分隔符去掉:
bool isDelimiter(char c)
{auto const isAllowedInName = isalnum(c) || c == '_';return !isAllowedInName;
}auto symbols = std::vector<std::string>{};
boost::split(symbols, code, isDelimiter);
symbols.erase(std::remove(begin(symbols), end(symbols), ""), end(symbols));
然后是计数函数:
std::map<std::string, size_t> countWords(std::vector<std::string> const& words)
{auto wordCount = std::map<std::string, size_t>{};for (auto const& word : words){++wordCount[word];}return wordCount;
}
进行排序操作:
auto sortedWordCount = WordCount(begin(wordCount), end(wordCount)); //类型转换std::sort(begin(sortedWordCount), end(sortedWordCount), [](auto const& p1, auto const& p2) { return p1.second > p2.second; });
基本操作就完成了,那么我们怎么进行测试呢?先进行本地测试吧,在代码中嵌入一小段代码进行测试,那么问题来了,代码格式中可能有空格、引用符号、代码分散在几行,我们怎样才能做到解决这个问题呢?好在C++11中的原始字符串字面量正好解决了这类问题。我们可以写一个R
在这些代码之前:R"(this is a code test)"
。
所有代码如下:
#include<iostream>
#include<iomanip>
#include<string>
#include<map>
#include<vector>
#include<iterator>
#include<boost/algorithm/string.hpp>using WordCount = std::vector<std::pair<std::string, size_t>>;
WordCount getWordCount(std::string const& code);bool isDelimiter(char c)
{auto const isAllowedInName = isalnum(c) || c == '_';return !isAllowedInName;
}std::map<std::string, size_t> countWords(std::vector<std::string> const& words)
{auto wordCount = std::map<std::string, size_t>{};for (auto const& word : words){++wordCount[word];}return wordCount;
}WordCount getWordCount(std::string const& code)
{auto symbols = std::vector<std::string>{};boost::split(symbols, code, isDelimiter);symbols.erase(std::remove(begin(symbols), end(symbols), ""), end(symbols));auto const wordCount = countWords(symbols);auto sortedWordCount = WordCount(begin(wordCount), end(wordCount)); //类型转换std::sort(begin(sortedWordCount), end(sortedWordCount), [](auto const& p1, auto const& p2) { return p1.second > p2.second; });return sortedWordCount;
}//void print(WordCount const& entries)
//{
// for (auto const& entry : entries)
// {
// std::cout << std::setw(30) << std::left << entry.first << '|' << std::setw(10) << std::right << entry.second << '\n';
// }
//}void print(WordCount const& entries)
{if (entries.empty()) return;auto const longestWord = *std::max_element(begin(entries), end(entries), [](auto const& p1, auto const& p2) { return p1.first.size() < p2.first.size(); });auto const longestWordSize = longestWord.first.size();for (auto const& entry : entries){std::cout << std::setw(longestWordSize + 1) << std::left << entry.first << '|' << std::setw(10) << std::right << entry.second << '\n';}
}static constexpr auto code = R"(
bool isDelimiter(char c)
{
auto const isAllowedInName = isalnum(c) || c == '_';
return !isAllowedInName;
}
std::map<std::string, size_t> countWords(std::vector<std::string> const& words)
{
auto wordCount = std::map<std::string, size_t>{};
for (auto const& word : words)
{
++wordCount[word];
}
return wordCount;
}
WordCount getWordCount(std::string const& code)
{
auto symbols = std::vector<std::string>{};
boost::split(symbols, code, isDelimiter);
symbols.erase(std::remove(begin(symbols), end(symbols), ""), end(symbols));
auto const wordCount = countWords(symbols);
auto sortedWordCount = WordCount(begin(wordCount), end(wordCount));
std::sort(begin(sortedWordCount), end(sortedWordCount), [](auto const& p1, auto const& p2){ return p1.second > p2.second; });
return sortedWordCount;
}
})";int main()
{print(getWordCount(code));system("pause");
}
结果如下:
转载于:https://www.cnblogs.com/yunlambert/p/10131248.html
实现一个简单的代码字计数器(二)相关推荐
- 实现一个简单的代码字计数器(一)
前面的文章里已经介绍了如何分割字符串,博客地址在这里 这里打算分几篇文章来写: 分割字符串 实现一个简单的代码字计数器(一) 实现一个简单的代码字计数器(二) 实现一个简单的代码字计数器(三) 实现一 ...
- Python制作一个简单的抽奖软件(二)
Python制作一个简单的抽奖软件(二) 认识QT 因为都对 QT和tkinter都没用过,之前简单使用tkinter后发现,界面调整不太好弄.然后度娘了之后,QT是强大GUI库之一,很多人都推荐它. ...
- 使用UE4创建一个简单真实的地球(二)
使用UE4创建一个简单真实的地球 如何创建一个简单的地球材质. BaseColor 基础颜色 排除由反射引起的杂光之后物体的颜色.主要用来模拟地球的真实表面. 白昼 地图与云图叠加,即图像的叠加运算( ...
- 使用PlayCanvas制作一个简单的小游戏(二)
原文:http://developer.playcanvas.com/zh/tutorials/beginner/keepyup-part-two/ 设置材质 在这个游戏中,我们尽可能的使用了简单的图 ...
- Solidify实现一个智能合约16(创建一个简单的代币)
创建一个工程,新建一个EncryptedToken合约. 代码如下: pragma solidity ^0.4.4;contract EncryptedToken {uint INITIAL_SUPP ...
- IDEA搭建一个简单的Javaweb项目(二)
说明: IntelliJ IDEA 版本为2017.2.6 JDK 版本为1.9 tomcat 版本为apache-tomcat-9 mysql版本是MySQL_5_green(链接数据库的默认用户名 ...
- UE4-如何做一个简单的TPS角色(二)-实现角色基础移动
先将项目设置打开,把我们创建的关卡场景,设置为编辑器默认打开地图和游戏默认地图 这个时候我们会发现,我们用的游戏模式还是最基础的gamemode,接下来我们需要创建一个专属的游戏模式,在项目路径中创建 ...
- SpringMvc-maven-Mysql-ajax-bootsrap进行一个简单的web开发(大二下期末考试内容)
首先创建我们的数据表 如图所示 再进行编写我们的一个前端页面 <!DOCTYPE html> <html lang="en"> <head>&l ...
- WCF+Silverlight一个简单的RSS阅读器(二)
嘿嘿,坚持不懈,继续我的Silverlight之旅,创建了WCF服务,我们需要的是通过Silverlight能够应用这个服务, 比起2005,2008的服务引用做的好多了,上图: 通过右边的Disco ...
最新文章
- wps解析json数据_通过WordPress HTTP API 获取json内容并解析
- ASP.NET弹出一个对话框
- apache启服务命令_apache_cgi绕过disable_functions
- python导出xlsx_使用python库xlsxwriter库来输出各种xlsx文件
- 测试综合技能的期末预测
- SpringBoot-视图解析与模板引擎
- Spring面试之bean作用域
- 语音识别学习笔记(三)【动态时间归正的识别技术】
- 前端入门14-JavaScript进阶之继承
- 浅谈ASP.NET客户端回调
- Linux系统编程二:字符设备控制之点亮LED灯、控制蜂鸣器
- 批量生成 Hibernate Dao
- setlocale()函数详解——C语言
- 哈密瓜水果的文案,水果哈密瓜文案高级感
- WPS for Linux使用测评
- android 重复解绑服务,Android培训实战教程之多次解绑抛出异常原因
- MySql的一些常见笔试题(1)
- 【C/C++】教你区分libc、glibc、libgcc、libstdc++等名词
- 网站UI设计应具有的8大品质和特点--摘自《众妙之门--网站UI设计之道》
- Abaqus接触分析-- Tips