RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 753303
Accepted
Sova Kefirova
Sova Kefirova
Asked:2020-12-04 04:15:46 +0000 UTC2020-12-04 04:15:46 +0000 UTC 2020-12-04 04:15:46 +0000 UTC

如何在不使用循环的情况下确定字符串中长度为 k 的单词的数量?

  • 772

给定一个字符串,其中单词由空格和冒号分隔。我们需要计算长度小于 k 的单词的数量并返回这些单词的容器。禁止使用循环,只允许使用 STL 算法和容器。我什至不知道如何做到这一点。我至少想要一个想法。

c++
  • 5 5 个回答
  • 10 Views

5 个回答

  • Voted
  1. Jens
    2020-12-04T04:49:00Z2020-12-04T04:49:00Z

    这是在标准输入流上搜索字符组合,不是通过循环while,而是使用谓词和算法std::find_if。我提出这个解决方案:

    std::find_if(std::istream_iterator<std::string>(std::cin),
                 std::istream_iterator<std::string>(),
                 Predicate());
    

    其中Predicate()调用类 Predicate 的构造函数带有特定的 operator()。

    您可以实现一个谓词来检查读取的对象是否是单词而不是冒号(虽然从单词如何分隔的问题中并不完全清楚,请给出具体示例),如果是单词,则检查其长度. 例如,参见类string和成员函数length()。

    示例类实现Predicate:

    // глобальными эти переменные не стоит делать, хотя бы в namespace надо их засунуть
    
    std::uint64_t counter = 0;            // счетчик всех слов в вводимом тексте
    std::map<std::string, int> container; // ключ - слово, значение - кол-во копий
    
    class Predicate
    {
        Predicate() {}
        void operator()(const std::string & str) // предполагается ввод word : word : word и т.д.
        {
            if (str != “:” && str.length() < k)
            {
                ++counter;
                ++container[str];
            }
        }
    };
    

    让我给你一个用法的例子std::istream_iterator。使用迭代器读取数据:

    if (iit != eos) str = *iit;
    ++iit;
    

    其中iitisstd::istream_iterator<string>和eos是同类型的迭代器,表示输入结束。您可以在 Internet 上轻松找到有关我的答案中使用的 C++ 功能的信息,请参阅此站点和此站点。

    • 0
  2. Timur Yalymov
    2020-12-04T04:58:24Z2020-12-04T04:58:24Z

    你的任务首先想到的是:

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <list>
    
    std::list<std::string> result;
    std::string str;
    int size = /*Необходимая длина*/
    
    struct Func 
    {
        Func() {}
        void operator()(char & letter) 
        {
            if (!str.empty())
            {
                if (letter == ':' || letter == ' ')
                {
                    size_t pos = str.find_first_of(":");
                    std::string temp = str.substr(0, pos);
                    if (temp.length() < size) { result.push_back(temp); }
                    str.erase(0, pos + 1);
                }
                else if (str.find_first_of(":") == std::string::npos)
                {
                    std::string temp = str.substr(0, str.length());
                    if (temp.length() < size) { result.push_back(temp); }
                    str.clear();
                }
            }
        }
    };
    
    int main()
    
    {
        std::getline(std::cin, str);
        std::for_each(str.begin(), str.end(), Func());
        /*Далее работа с контейнером result*/
    }
    
    • 0
  3. Alex Titov
    2020-12-04T23:53:26Z2020-12-04T23:53:26Z

    这是一段代码,它将f使用字符串中的所有单词调用一个对象s

    std::for_each(std::istream_iterator<std::string>(std::istringstream(s)), std::istream_iterator<std::string>(), f);
    

    有两个问题: 1. 单词是由标准的空白字符分配的,所以在调用之前将字符串中的冒号替换为空格是最简单的。2.f不只是一个函数,而且必须“某处”返回容器和数量,因此您必须使用对容器的引用来初始化一个类,并使用一个operator ()( std::string &s)将检查字符串长度并补充容器的成员。

    • 0
  4. Best Answer
    verybadcoder
    2021-10-24T19:53:12Z2021-10-24T19:53:12Z

    解决方案可能不是最佳的,但仍然:编写以下递归函数:std::find()在字符串中的冒号或空格的帮助下搜索,找到 -std::substr()如果它的长度小于k,push_back()它是一个向量。从原始字符串中删除此冒号/空格。接下来,如果字符串长度> 0,则再次调用此函数。确实,对于大字符串,这很可能不会及时传递(您可以尝试缓存该函数,这会大大加快处理速度)。

    • 0
  5. JeeOpp
    2020-12-04T04:23:55Z2020-12-04T04:23:55Z

    我会这样做,创建一个堆栈,遍历该行,将每个字母写入堆栈,查看空格或冒号,查看堆栈,如果匹配,则将堆栈中的单词添加到容器中,清除堆栈等.

    • -1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5