Rocket Procd
Rocket Procd

Reputation: 103

Fastest way to count words of string

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;
}

Upvotes: 1

Views: 422

Answers (1)

Arty
Arty

Reputation: 16747

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.

Try it online

#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

Upvotes: 2

Related Questions