How could I make this algorithm faster and shorten this code which counts word of given string?
int number_of_words(std::string &s) {
int count = 0;
for (int i = 0; i < s.length(); i ) {
// skip spaces
while (s[i] == ' ' && i < s.length())
i ;
if (i == s.length())
break;
// word found
count ;
// inside word
while (s[i] != ' ' && i < s.length())
i ;
}
return count;
}
CodePudding user response:
Your code is quite alright, speed-wise. But if you want to make your code shorter, you may use find_first_not_of() and find_first_of standard functions, like I did in following code that solves your task.
I made an assumption that all your words are separated by only spaces. If other separators are needed you may pass something like " \r\n\t"
instead of ' '
in both lines of my code.
One small optimization that can be made in your code is when you notice that after first while-loop we're located on non-space character, so we can add i;
line for free before second loop. Similarly after second while-loop we're located on space character so we may add one more i;
line after second while loop. This will give a tiny bit of speed gain to avoid extra two checks inside while loop.
#include <iostream>
#include <string>
int number_of_words(std::string const & s) {
ptrdiff_t cnt = 0, pos = -1;
while (true) {
if ((pos = s.find_first_not_of(' ', pos 1)) == s.npos) break;
cnt;
if ((pos = s.find_first_of(' ', pos 1)) == s.npos) break;
}
return cnt;
}
int main() {
std::cout << number_of_words(" abc def ghi ") << std::endl;
}
Output:
3