starts_with 是 C++20 中 std::string 和 std::string_view 的成员函数,需用点号调用,支持字面量、单字符和 string_view 三种参数,区分大小写且对空串返回 true,要求编译器支持 C++20 并启用对应标准。

starts_with 是 C++20 string 的成员函数,不是全局函数
很多人搜 starts_with 时直接写 starts_with(str, "abc"),编译报错——因为它是 std::string(和 std::string_view)的成员函数,必须用点号调用。C++20 之前没有这个接口,别在低版本标准下硬试。
常见错误现象:error: 'starts_with' was not declared in this scope,基本就是忘了加 .starts_with(...) 或没开 C++20。
- 确保编译器支持 C++20:GCC 10+、Clang 10+、MSVC 19.20+,且显式启用
-std=c++20(或/std:c++20) - 只能用于
std::string、std::string_view、const char*、char等少数类型参数,不接受任意容器或自定义类型 - 对
std::string_view同样有效,且更轻量,适合只读场景
三种常用调用形式及参数差异
starts_with 有三个重载,关键区别在参数类型和匹配逻辑:
-
s.starts_with("abc"):匹配字面量字符串(推导为std::string_view),最常用 -
s.starts_with('a'):匹配单个字符,注意是单引号 -
s.starts_with(sv):传入std::string_view变量,适合复用或避免临时构造
示例:
立即学习“C++免费学习笔记(深入)”;
std::string s = "apple pie";
std::string_view sv = "app";
s.starts_with("app"); // true
s.starts_with('a'); // true
s.starts_with(sv); // true
s.starts_with("Apple"); // false(区分大小写)
区分大小写 + 空字符串行为要特别注意
starts_with 默认严格区分大小写,也不做任何 Unicode 或 locale 感知处理。另外,它对空字符串的处理容易被忽略:
-
"hello".starts_with("")返回true(所有字符串都以空串开头) -
""(空字符串)调用.starts_with("x")返回false(长度不够) - 没有内置忽略大小写的版本,需要手动转小写或用
std::equal配合std::tolower
若需忽略大小写,别写循环比对,推荐:
std::string_view s = "Hello World";
std::string_view prefix = "hello";
std::equal(prefix.begin(), prefix.end(), s.begin(),
[](char a, char b) { return std::tolower(a) == std::tolower(b); });
性能和兼容性提醒
底层只是逐字节比较前缀长度的字符,时间复杂度 O(n),无额外分配。但要注意:
- 传
const char*会隐式构造std::string_view,零开销;传std::string则可能触发不必要的data()调用,建议优先用string_view或字面量 - 如果项目还需兼容 C++17,不能直接用
starts_with,可用s.substr(0, prefix.size()) == prefix(注意检查长度防越界)或std::mismatch - 第三方库如 abseil、folly 提供了类似接口,但语义未必完全一致,混用时要核对文档
真正容易被忽略的是:它不检查 nullptr,传入悬垂的 const char* 或已析构的 string_view 会导致未定义行为——这和 std::string 其他成员函数一样,责任在调用方。


















