• 分割字符串
  • 实现一个简单的代码字计数器(一)
  • 实现一个简单的代码字计数器(二)
  • 实现一个简单的代码字计数器(三)
  • 实现一个简单的代码字计数器(四)

这一篇里让我们先实现基本功能,特性和改善放在后几篇实现里面。

要使一个函数执行一段代码的单词计数,让我们从设计它的接口开始。我们考虑输出的形式应该是什么样的:输入为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

实现一个简单的代码字计数器(二)相关推荐

  1. 实现一个简单的代码字计数器(一)

    前面的文章里已经介绍了如何分割字符串,博客地址在这里 这里打算分几篇文章来写: 分割字符串 实现一个简单的代码字计数器(一) 实现一个简单的代码字计数器(二) 实现一个简单的代码字计数器(三) 实现一 ...

  2. Python制作一个简单的抽奖软件(二)

    Python制作一个简单的抽奖软件(二) 认识QT 因为都对 QT和tkinter都没用过,之前简单使用tkinter后发现,界面调整不太好弄.然后度娘了之后,QT是强大GUI库之一,很多人都推荐它. ...

  3. 使用UE4创建一个简单真实的地球(二)

    使用UE4创建一个简单真实的地球 如何创建一个简单的地球材质. BaseColor 基础颜色 排除由反射引起的杂光之后物体的颜色.主要用来模拟地球的真实表面. 白昼 地图与云图叠加,即图像的叠加运算( ...

  4. 使用PlayCanvas制作一个简单的小游戏(二)

    原文:http://developer.playcanvas.com/zh/tutorials/beginner/keepyup-part-two/ 设置材质 在这个游戏中,我们尽可能的使用了简单的图 ...

  5. Solidify实现一个智能合约16(创建一个简单的代币)

    创建一个工程,新建一个EncryptedToken合约. 代码如下: pragma solidity ^0.4.4;contract EncryptedToken {uint INITIAL_SUPP ...

  6. IDEA搭建一个简单的Javaweb项目(二)

    说明: IntelliJ IDEA 版本为2017.2.6 JDK 版本为1.9 tomcat 版本为apache-tomcat-9 mysql版本是MySQL_5_green(链接数据库的默认用户名 ...

  7. UE4-如何做一个简单的TPS角色(二)-实现角色基础移动

    先将项目设置打开,把我们创建的关卡场景,设置为编辑器默认打开地图和游戏默认地图 这个时候我们会发现,我们用的游戏模式还是最基础的gamemode,接下来我们需要创建一个专属的游戏模式,在项目路径中创建 ...

  8. SpringMvc-maven-Mysql-ajax-bootsrap进行一个简单的web开发(大二下期末考试内容)

    首先创建我们的数据表 如图所示 再进行编写我们的一个前端页面 <!DOCTYPE html> <html lang="en"> <head>&l ...

  9. WCF+Silverlight一个简单的RSS阅读器(二)

    嘿嘿,坚持不懈,继续我的Silverlight之旅,创建了WCF服务,我们需要的是通过Silverlight能够应用这个服务, 比起2005,2008的服务引用做的好多了,上图: 通过右边的Disco ...

最新文章

  1. wps解析json数据_通过WordPress HTTP API 获取json内容并解析
  2. ASP.NET弹出一个对话框
  3. apache启服务命令_apache_cgi绕过disable_functions
  4. python导出xlsx_使用python库xlsxwriter库来输出各种xlsx文件
  5. 测试综合技能的期末预测
  6. SpringBoot-视图解析与模板引擎
  7. Spring面试之bean作用域
  8. 语音识别学习笔记(三)【动态时间归正的识别技术】
  9. 前端入门14-JavaScript进阶之继承
  10. 浅谈ASP.NET客户端回调
  11. Linux系统编程二:字符设备控制之点亮LED灯、控制蜂鸣器
  12. 批量生成 Hibernate Dao
  13. setlocale()函数详解——C语言
  14. 哈密瓜水果的文案,水果哈密瓜文案高级感
  15. WPS for Linux使用测评
  16. android 重复解绑服务,Android培训实战教程之多次解绑抛出异常原因
  17. MySql的一些常见笔试题(1)
  18. 【C/C++】教你区分libc、glibc、libgcc、libstdc++等名词
  19. 网站UI设计应具有的8大品质和特点--摘自《众妙之门--网站UI设计之道》
  20. Abaqus接触分析-- Tips

热门文章

  1. k3s containerd查看镜像命令示例
  2. loadrunner脚本运行时设置:Run Logic设置运行次数
  3. Python3 打印九九乘法表
  4. HBase get查询命令及VERSIONS版本
  5. Linux vim命令模式、末行模式、编辑模式相互切换
  6. 谈谈分布式的场景及分布式事务的解决方案
  7. Linux fork()函数底层CopyOnWrite写时复制实现原理剖析
  8. Java基础--通过反射获取成员方法并使用
  9. Java泛型失效的两种情况
  10. IDEA突然自动关闭然后无法启动