有没有一种方法可以比一次循环一个字符更快地查找“\n”字符?

alv*_*vas -4 c++ string newline count wc

查看计算行数时的示例实现wc.c,它循环遍历文件,一次一个字符并累加 '\n' 以计算换行数:

#define COUNT(c)       \
      ccount++;        \
      if ((c) == '\n') \
        lcount++;
Run Code Online (Sandbox Code Playgroud)
  • 有没有办法只在文件中查找“\n”并继续跳转到换行符并进行计数?

  • 寻找 '\n' 与一次读取一个字符直到我们看到 '\n' 并对其进行计数是一样的吗?

Vir*_*co_ 5

'\n'好吧,除了一个角色之外,所有角色都不是。无分支算法可能会更快。
不过你尝试过吗std::count

#include <string>
#include <algorithm>

int main() {
  const auto s = std::string("Hello, World!\nfoo\nbar\nbaz");
  const auto lines_in_s = std::count(s.cbegin(), s.cend(), '\n');
  return lines_in_s;
}
Run Code Online (Sandbox Code Playgroud)

编译器资源管理器

或者使用文件:

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>

int main() {
    if (std::ifstream is("filename.txt"); is) {
        const auto lines_in_file =
            std::count(std::istreambuf_iterator<char>(is),
                       std::istreambuf_iterator<char>{}, '\n');

        std::cout << lines_in_file << '\n';
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器资源管理器