C++函数计算字符串中的所有单词

2023-11-27

我在一次采访中被问到这个问题,显然这是一个简单的问题,但对我来说不是,而且仍然不明显。

给定一个字符串,计算其中的所有单词。即使重复也没关系。只是总数,就像文本文件的字数一样。单词是由空格分隔的任何内容,标点符号并不重要,只要它是单词的一部分即可。

例如:A very, very, very, very, very big dog ate my homework!!!! ==> 11 words

我的“算法”只是寻找空格并增加计数器,直到达到空值为止。由于我没有得到这份工作并被要求离开,我想我的解决方案不好?有人有更聪明的解决方案吗?我错过了什么吗?


假设单词之间以空格分隔:

unsigned int countWordsInString(std::string const& str)
{
    std::stringstream stream(str);
    return std::distance(std::istream_iterator<std::string>(stream), std::istream_iterator<std::string>());
}

注意:单词之间可能有多个空格。此外,这不会捕获其他空白字符,例如制表符换行符或回车符。所以计算空格是不够的。

流输入运算符 >> 用于从流中读取字符串。读取一个空格分隔的单词。所以他们可能正在找你用它来识别单词。

std::stringstream  stream(str);
std::string        oneWord;

stream >> oneWord; // Reads one space separated word.

什么时候可以使用它来计算字符串中的单词数。

std::stringstream  stream(str);
std::string        oneWord;
unsigned int       count = 0;

while(stream >> oneWord) { ++count;}
// count now has the number of words in the string.

变得复杂:
流可以像任何其他容器一样对待,并且有迭代器可以循环它们 std::istream_iterator。当您在 istream_iterator 上使用 ++ 运算符时,它只是使用运算符 >> 从流中读取下一个值。在本例中,我们正在读取 std::string,因此它读取一个空格分隔的单词。

std::stringstream  stream(str);
std::string        oneWord;
unsigned int       count = 0;

std::istream_iterator loop = std::istream_iterator<std::string>(stream);
std::istream_iterator end  = std::istream_iterator<std::string>();

for(;loop != end; ++count, ++loop) { *loop; }

使用 std::distance 只是将上述所有内容包装在一个整洁的包中,因为它通过在第一个迭代器上执行 ++ 直到到达第二个迭代器来找到两个迭代器之间的距离。

为了避免复制字符串,我们可以偷偷摸摸:

unsigned int countWordsInString(std::string const& str)
{
    std::stringstream stream;

    // sneaky way to use the string as the buffer to avoid copy.
    stream.rdbuf()->pubsetbuf (str.c_str(), str.length() );
    return std::distance(std::istream_iterator<std::string>(stream), std::istream_iterator<std::string>());
}

注意:我们仍然将原始单词中的每个单词复制到临时单词中。但这样做的成本是最小的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++函数计算字符串中的所有单词 的相关文章

随机推荐

  • 服务限制默认值?

    Hi 根据这个link默认值WCF 4 0这是 最大并发会话数 16 处理器数量 最大并发会话数 MaxConcurrentCalls MaxConcurrentSessions 100 处理器计数 最大并发会话数 100 处理器数量 我知
  • 从 gevent-subprocess 获取实时标准输出?

    我试图通过 POPEN 立即获取进程的标准输出 使用 gevent 1 0 readline 和 read 仍然会阻塞进程并等待进程完成 有什么线索吗 是的 我到处寻找一个简单的解决方案 没有线程它必须是可能的 对吗 import geve
  • Isabelle/HOL 验证器核心

    Question Isabelle HOL验证器的核心算法是什么 我正在寻找方案元循环评估器级别的东西 澄清 我只对Verifier 而不是自动定理证明的策略 Context 我想从头开始实现一个简单的证明验证器 纯粹出于教育原因 而不是用
  • 使用 Chrome API 时未检查runtime.lastError

    I use chrome fileSystem我的应用程序中用于打开文件的 API 当我点击Cancel文件选择器对话框的按钮时 出现错误 未选中runtime lastError在跑步的时候fileSystem chooseEntry 用
  • 使用GSON读写数据

    我正在努力寻找一个关于如何使用 GSON 在我的 Android 应用程序中读取和写入数据的好例子 有人可以向我展示或指出一个很好的例子吗 我用它来保持活动之间的数据持久性 我的教授举了这个例子来写作 Vector v new Vector
  • T-SQL:如何仅更新日期时间字段的日期部分?

    在 SQL Server 2008 中 我只需要更新日期时间字段的日期部分 在我的存储过程中 我收到日期时间格式的新日期 我必须从这个参数中提取日期 对时间不感兴趣 并更新现有值日期部分 我怎样才能做到这一点 一种方法是将日期之间的天数差异
  • 如何使用 AJAX 和 jQuery 发布 django 表单

    我已经检查了大量关于 django AJAX 表单的教程 但是每个教程都告诉您一种实现方法 没有一个是简单的 而且我有点困惑 因为我从未使用过 AJAX 我有一个名为 note 的模型 它的模型表单 在模板内 每次 note 元素发送 st
  • 在 JavaScript 中,如何等待动态注入的脚本加载后再开始使用它们?

    不使用任何外部库如何在使用脚本之前等待脚本加载 就我而言 我使用以下方式加载脚本 function w d t s e r e d createElement o r d getElementsByTagName o 0 e async 1
  • 错误:在最新检查期间无法捕获任务“transformClassesWithDexForDebug”的输出文件快照

    我是 Android 应用程序开发新手 试图构建一个简单的界面 但遇到了这个错误 我该如何解决它 整个错误声明是这样的 错误 在最新检查期间无法捕获任务 transformClassesWithDexForDebug 的输出文件快照 jav
  • 主干视图继承

    我正在尝试为对象浏览器编写一个 Backbone 视图 该视图旨在在具有不同对象类型和略有不同操作的多个地方实现 我尝试简单地扩展浏览器中的主干视图 然后在我的实现中扩展浏览器 但这给我留下了一些共享的属性 这是不期望的效果 因为每次创建浏
  • JSON.stringify() 值作为数字?

    我在用JSON stringify 在 HTML 上
  • 如何在所有元素上用“js”替换“no-js”类名? [复制]

    这个问题在这里已经有答案了 我想做的是获取具有类名的元素no js并将其替换为js 我不知道该怎么做 我尝试谷歌搜索但找不到任何东西 所以有人知道该怎么做吗 我的目标是让菜单在单击时显示下拉导航 但如果禁用 JavaScript 我希望它在
  • Kadane算法中如何返回最大子数组?

    public class Kadane double maxSubarray double a double max so far 0 double max ending here 0 for int i 0 i lt a length i
  • 将元素添加到状态 React

    我已经有了这样的状态 this setState conversation div conversation map element gt if element id this props id return div div div div
  • 旧应用程序的 PAM 身份验证

    我有一个遗留应用程序 它通过网络异步接收用户名 密码请求 由于我已经将用户名和密码存储为变量 那么在 Linux Debian 6 上使用 PAM 进行身份验证的最佳方法是什么 我尝试编写自己的对话函数 但我不确定将密码输入其中的最佳方法
  • YouTube 链接的正则表达式

    是否有人有一个正则表达式 可以从 几乎 所有可能的 Youtube 链接方式获取 Youtube 视频 非嵌入对象 的链接 我认为这是一个非常常见的问题 并且我确信有很多方法可以将其联系起来 起点是 http www youtube com
  • 修改 String 的 List 迭代

    我无法以这种方式修改列表的元素 for String s list s x s 执行后此列表中的代码元素未更改 如何用最简单的方式通过List实现modyfing的迭代 Since String对象是不可变的 您无法更改正在迭代的值 此外
  • 如何通过 TFS API 获取最新的变更集编号

    如何通过 TFS API 获取最新的变更集编号 你能给我举个例子吗 干得好 TeamProjectPicker tpp new TeamProjectPicker TeamProjectPickerMode SingleProject tr
  • jqGrid:如何在不同页面上使用多选

    简单的问题 很难找到答案 如果我尝试以编程方式选择一行 我会使用以下命令 grid jqGrid setSelection rowId 问题是它只选择当前可见页面上的行 如果rowId在另一页上 则不会被选择 更多信息 我的目标是在第一次加
  • C++函数计算字符串中的所有单词

    我在一次采访中被问到这个问题 显然这是一个简单的问题 但对我来说不是 而且仍然不明显 给定一个字符串 计算其中的所有单词 即使重复也没关系 只是总数 就像文本文件的字数一样 单词是由空格分隔的任何内容 标点符号并不重要 只要它是单词的一部分