最快/最小方法检查字符串是否包含多个单词
Fastest/most minimal way to check if string contains multiple words
我正在使用C 11,并且可以使用Regex东西。我想知道什么是最快检查字符串是否包含多个单词的方法,如果是多少个单词。在这种情况下,单词被定义为由空格隔开的字符组。
我有一些选择:
- file the whitespace的拆分字符串,计数拆分长度
- 使用某种正则
- 计数空格字符
选项1是最简单的方法,但是考虑到多个空格字符的核算使拆分更加复杂。2可能较慢,我不确定如何从中获得计数。3是我能想到的最快的,但是可能有很多角案件需要考虑。我希望我的解决方案尽可能高效,并尽可能少。这对我来说是一个可解决的问题,但是我需要更多关于最佳解决方案的见解。
我倾向于第一个,但是什么功能是最好的?istringstream
加上迭代器stringstream
,一些char*
魔术?我不确定最快的方法是什么。
我会迭代字符串,计算单词并在任何连续的空间上进行迭代。
- 每当从空格转移到非空间时增加单词计数。
-
如果字符串以非whitespace开头
,请增加单词计数int countWords(string& toCount, const string& whitespace){ enum countStatus { startOfString, initialWhitespace, movePastWord, movePastWhitespace } status=startOfString; int wordCount=0; for(char& c : toCount) { bool characterIsWhitespace=false; if (whitespace.find(c)!=string::npos) { characterIsWhitespace=true; } switch(status) { case startOfString: if (characterIsWhitespace) { status=initialWhitespace; } else { status=movePastWord; wordCount++; } break; case initialWhitespace: if (!characterIsWhitespace) { wordCount++; status=movePastWord; } break; case movePastWord: if (characterIsWhitespace) { status=movePastWhitespace; } break; case movePastWhitespace: if (!characterIsWhitespace) { wordCount++; status=movePastWord; } } } return wordCount; }
在这种情况下,您可以使用关联容器。C 有多种选择。例如,您可以使用std::map
。在以下代码中,您可以计算文本中发生多少个多词。
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
int main()
{
std::map<std::string,int> strCount;
std::string str("AA BB ABC AA GE AAf FF JJ BB CC ");
std::string temp;
// Split String Based on Whitespace (i.e. you need to modify it to suit the text format you have. )
for ( int i(0); i < str.size(); ++i ){
temp += str[i];
if ( str[i] == ' ' ){
temp.pop_back();
++strCount[temp]; // <-- if element new, insert it in map and associate new counter, otherwise increment counter of element.
temp.clear();
}
}
std::map<std::string,int>::const_iterator iter;
for( iter = strCount.begin(); iter != strCount.end(); iter++ ) {
std::cout << "#: " << iter->second << " string: " << iter->first << std::endl;
}
return 0;
}
前面代码的输出为
#: 2 string: AA
#: 1 string: AAf
#: 1 string: ABC
#: 2 string: BB
#: 1 string: CC
#: 1 string: FF
#: 1 string: GE
#: 1 string: JJ
相关文章:
- C++-字符串是否包含一个带有简单循环的单词
- 如果中的多个语句是否与多个 if 相同?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- C++ 在堆栈中包含多态属性的类对象存储
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 即使我没有包含多个文件,C++中的多个定义错误
- 实现包含多个 QQuickPaintedItems 的 QQuickView 的滚动
- 检查路径是否包含C++中的另一个路径
- C++17:使用 std::optional 来评估枚举是否包含值
- C++文件包含多行
- 如何存储包含多个空格的字符串 c++
- 如果代码包含多个复杂度循环,如何计算复杂度
- 如何检查 int 变量是否包含合法(非陷阱表示)值?
- 如何确定integer_sequence在编译时是否包含给定的数字?
- 将包含多个元素的字符串作为输入并转换为矢量 C++
- 如何检查一个字符串是否包含多个其他字符串?
- 如何检查数组是否包含多个元素?
- 最快/最小方法检查字符串是否包含多个单词
- C++:如果我包含多个头文件,如果两个都有 #include,是否会导致任何问题<string>?
- 如何查看一个字符串是否包含多个不同的字母