// глобальными эти переменные не стоит делать, хотя бы в 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++ 功能的信息,请参阅此站点和此站点。
这是在标准输入流上搜索字符组合,不是通过循环
while,而是使用谓词和算法std::find_if。我提出这个解决方案:其中
Predicate()调用类 Predicate 的构造函数带有特定的 operator()。您可以实现一个谓词来检查读取的对象是否是单词而不是冒号(虽然从单词如何分隔的问题中并不完全清楚,请给出具体示例),如果是单词,则检查其长度. 例如,参见类
string和成员函数length()。示例类实现
Predicate:让我给你一个用法的例子
std::istream_iterator。使用迭代器读取数据:其中
iitisstd::istream_iterator<string>和eos是同类型的迭代器,表示输入结束。您可以在 Internet 上轻松找到有关我的答案中使用的 C++ 功能的信息,请参阅此站点和此站点。你的任务首先想到的是:
这是一段代码,它将
f使用字符串中的所有单词调用一个对象s有两个问题: 1. 单词是由标准的空白字符分配的,所以在调用之前将字符串中的冒号替换为空格是最简单的。2.
f不只是一个函数,而且必须“某处”返回容器和数量,因此您必须使用对容器的引用来初始化一个类,并使用一个operator ()( std::string &s)将检查字符串长度并补充容器的成员。解决方案可能不是最佳的,但仍然:编写以下递归函数:
std::find()在字符串中的冒号或空格的帮助下搜索,找到 -std::substr()如果它的长度小于k,push_back()它是一个向量。从原始字符串中删除此冒号/空格。接下来,如果字符串长度> 0,则再次调用此函数。确实,对于大字符串,这很可能不会及时传递(您可以尝试缓存该函数,这会大大加快处理速度)。我会这样做,创建一个堆栈,遍历该行,将每个字母写入堆栈,查看空格或冒号,查看堆栈,如果匹配,则将堆栈中的单词添加到容器中,清除堆栈等.