第9.13.1章: 字符串视图操作参考

English

概述

本附录记录所有字符串视图特有的操作。其中大部分在 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