std::count最快最安全但仅适用于连续内存,需传入迭代器范围和目标字符;对C风格字符串须显式计算长度,不可直接用字面量指针;不支持Unicode且区分大小写。

直接用 std::count 最快最安全,但要注意它只适用于连续内存(比如 std::string 或数组),不能直接用于 C 风格字符串字面量而不出错。
用 std::count 统计 std::string 中字符出现次数
这是最常用也最推荐的方式,底层调用的是泛型算法,对 std::string 的 begin()/end() 迭代器做遍历。
-
std::count在头文件中,必须包含 - 第三个参数是你要统计的字符(
char类型),不是字符串或整数 - 它返回
std::iterator_traits,通常可直接赋给::difference_type int或size_t
#include#include #include int main() { std::string s = "hello world"; int cnt = std::count(s.begin(), s.end(), 'l'); std::cout << cnt << "\n"; // 输出 3 }
对 C 风格字符串(const char*)使用 std::count 的陷阱
不能直接传 "hello" 的指针给 std::count,因为缺少长度信息——std::count 不会自动停在 \0,而是继续读直到迭代器越界(UB)。
- 错误写法:
std::count("hello", "hello" + 5, 'l')看似可行,但字面量地址不可靠,且容易算错长度 - 正确做法:先转成
std::string,或用std::strlen获取长度再构造迭代器范围 - 更稳妥的是用
std::count_if+std::not_equal_to?不,没必要——绕远了()
#include#include const char* cstr = "hello world"; size_t len = std::strlen(cstr); int cnt = std::count(cstr, cstr + len, 'o'); // 正确:显式提供 [begin, end)
手写循环 vs std::count:性能和可读性权衡
两者生成的汇编几乎一致(开启优化后),std::count 不额外开销,还更少出错。
立即学习“C++免费学习笔记(深入)”;
- 手写循环容易漏掉边界、写反比较符号、误用
-
std::count对std::vector、std::array同样适用 - 如果要统计多个字符(如元音),应换用
std::count_if配合 lambda
// 统计所有元音字母
int vowel_cnt = std::count_if(s.begin(), s.end(), [](char c) {
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
});真正容易被忽略的是:std::count 不区分大小写,也不处理 Unicode。如果你的字符串含 UTF-8 编码的中文或 emoji,'中' 这样的写法根本无效——那已经不是单个 char 了。











