我正在使用c ++ 11,并且可以使用正则表达式的东西。我想知道检查一个字符串是否包含多个单词的最快方法是什么,如果有的话多少。在这种情况下,单词被定义为由空格分隔的字符组。
我有几个选择:
选项1是最简单的方法,但考虑到多个空白字符会使分割更加复杂。 2可能更慢,我不知道如何计算它。 3是我能想到的最快,但可能有很多角落要考虑。我希望我的解决方案尽可能高效,并尽可能少地包含额外的库。这对我来说是一个可以解决的问题,但我需要更深入地了解最佳解决方案是什么。
我倾向于第一个,但那么什么功能最好? istringstream
加上迭代器,stringstream
,一些char*
魔法?我不确定最快的方法是什么。
答案 0 :(得分:1)
我会迭代字符串,计算单词并迭代任何连续的空格。
如果字符串以非空格开头,则增加字数
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;
}
答案 1 :(得分:0)
在这种情况下,您可以使用关联容器。 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