第9.13.1章: 字符串视图操作参考
概述
本附录记录所有字符串视图特有的操作。其中大部分在 string 上也可用(见附录第9.12.1节)。需要某个功能时再回来查。
1. npos
::fast_io::containers::npos(= SIZE_MAX)在所有 find* 操作查找失败时返回,也用作默认 count 参数,表示“直到末尾”。
#include <fast_io_dsal/string_view.h>
#include <fast_io.h>
using ::fast_io::containers::npos;
int main() {
::fast_io::string_view sv{"Hello, World!"};
// npos as "not found"
auto pos = sv.find_character('z');
if (pos == npos) {
::fast_io::io::println("'z' not found");
}
// npos as "to end"
auto tail = sv.subview(7zu); // default count = npos → "World!"
}
2. 子视图操作
| 操作 | 说明 | 示例 |
|---|---|---|
subview(pos, count=npos) |
从 pos 开始的 count 个字符的视图。 |
sv.subview(7zu) → from index 7 to end |
subview_front(count) |
前 count 个字符的视图。 |
sv.subview_front(5zu) → "Hello" |
subview_back(count) |
后 count 个字符的视图。 |
sv.subview_back(6zu) → "World!" |
copy(dest, count, pos=0) |
把 count 个字符复制到裸缓冲区 dest。 |
sv.copy(buf, 5zu) |
所有 subview* 方法都有跳过边界检查的 _unchecked 变体。
3. 查找操作
API 与 string 相同(见第9.12.1节)。找不到目标时都返回 npos。
| 操作 | 说明 | 示例 |
|---|---|---|
find_character(ch, pos=0) |
查找字符第一次出现的位置。 | sv.find_character('W') → 7 |
find_not_character(ch, pos=0) |
查找第一个不是 ch 的字符。 |
sv.find_not_character('H') → 1 |
rfind_character(ch, pos=npos) |
查找字符最后一次出现的位置。 | sv.rfind_character('l') → 10 |
rfind_not_character(ch, pos=npos) |
查找最后一个不是 ch 的字符。 |
sv.rfind_not_character('!') → 11 |
find(view, pos=0) |
查找子串第一次出现的位置。 | sv.find("World") → 7 |
rfind(view, pos=0) |
查找子串最后一次出现的位置。 | sv.rfind("l") → 10 |
find_first_of(view, pos) |
查找第一个与 view 中任意字符相同的字符。 |
sv.find_first_of("aeiou") → 1 ('e') |
find_first_not_of(view, pos) |
查找第一个与 view 中任何字符都不同的字符。 |
sv.find_first_not_of("Helo") → 5 (',') |
find_last_of(view, pos) |
查找最后一个与 view 中任意字符相同的字符。 |
sv.find_last_of("aeiou") → 8 ('o') |
find_last_not_of(view, pos) |
查找最后一个与 view 中任何字符都不同的字符。 |
sv.find_last_not_of(" !") → 11 ('d') |
contains_character(ch) |
若存在该字符则返回 true。 |
sv.contains_character('W') → true |
contains(view) |
若存在该子串则返回 true。 |
sv.contains("World") → true |
4. starts_with / ends_with
| 操作 | 说明 | 示例 |
|---|---|---|
starts_with(view) |
若视图以 view 开头则返回 true。 |
sv.starts_with("Hello") → true |
starts_with_character(ch) |
若第一个字符是 ch 则返回 true。 |
sv.starts_with_character('H') → true |
ends_with(view) |
若视图以 view 结尾则返回 true。 |
sv.ends_with("!") → true |
ends_with_character(ch) |
若最后一个字符是 ch 则返回 true。 |
sv.ends_with_character('!') → true |
5. 修剪操作(仅视图版)
它们返回去掉字符后的新视图 — 不会修改底层数据。
| 操作 | 说明 |
|---|---|
trim_subview_c_space() |
返回去掉开头和结尾空白字符的视图。 |
trim_prefix_subview_c_space() |
返回去掉开头空白字符的视图。 |
trim_suffix_subview_c_space() |
返回去掉结尾空白字符的视图。 |
通用的 trim_subview()、trim_prefix_subview()、trim_suffix_subview() 重载可接受字符类别特征。
6. remove_prefix / remove_suffix
它们通过前移起点或缩短终点来收缩视图。修改的是视图本身(而不是底层数据)。
| 操作 | 说明 | 示例 |
|---|---|---|
remove_prefix(n) |
把起点前移 n 个字符。 |
sv.remove_prefix(6zu); |
remove_suffix(n) |
把终点缩短 n 个字符。 |
sv.remove_suffix(1zu); |
clear() |
把视图重置为空指针、大小为 0。 | sv.clear(); |
两者都有跳过边界检查的 _unchecked 变体。
7. 比较
字符串视图支持 == 与 <=>(C++20 三路比较)。比较按字典序进行。
::fast_io::string_view a{"abc"};
::fast_io::string_view b{"abd"};
bool eq = (a == b); // false
auto cmp = (a <=> b); // std::strong_ordering::less