std::basic_string_view

来自cppreference.com
< cpp‎ | string
 
 
字符串库
空终止字符串
字节字符串
多字节字符串
宽字符串
basic_string_view
(C++17)
 
 
定义于头文件 <string_view>
template<

    class CharT,
    class Traits = std::char_traits<CharT>

> class basic_string_view;
(C++17 起)

类模板 basic_string_view 描述一个能指代常量连续仿 char 对象序列的对象,序列首元素在零位置。

std::basic_string_view 的每个特化均为可平凡复制 (TriviallyCopyable) 类型。

(C++23 起)

典型的实现仅保有二个成员:指向常 CharT 的指针和大小。

提供数种对常用字符类型的 typedef :

定义于头文件 <string_view>
类型 定义
std::string_view std::basic_string_view<char>
std::wstring_view std::basic_string_view<wchar_t>
std::u8string_view (C++20) std::basic_string_view<char8_t>
std::u16string_view std::basic_string_view<char16_t>
std::u32string_view std::basic_string_view<char32_t>

模板形参

CharT - 字符类型
Traits - 指定字符类型上操作的字符特征 (CharTraits) 类。同 basic_stringTraits::char_type 必须指名同 CharT 的类型,否则程序为谬构。

成员类型

成员类型 定义
traits_type Traits
value_type CharT
pointer CharT*
const_pointer const CharT*
reference CharT&
const_reference const CharT&
const_iterator 实现定义的常老式随机访问迭代器 (LegacyRandomAccessIterator) 常量表达式迭代器 (ConstexprIterator) (C++20 起)老式连续迭代器 (LegacyContiguousIterator) ,其 value_typeCharT
iterator const_iterator
const_reverse_iterator std::reverse_iterator<const_iterator>
reverse_iterator const_reverse_iterator
size_type std::size_t
difference_type std::ptrdiff_t

注解: iteratorconst_iterator 是同一类型,因为 string_view 是到常字符序列中的视图。

容器 (Container) 的迭代器类型上的所有要求亦应用于 basic_string_viewiteratorconst_iterator 类型。

成员函数

构造 basic_string_view
(公开成员函数)
对视图赋值
(公开成员函数)
迭代器
返回指向起始位置的迭代器
(公开成员函数)
返回指向结尾的迭代器
(公开成员函数)
返回指向起始的反向迭代器
(公开成员函数)
返回指向结尾的反向迭代器
(公开成员函数)
元素访问
访问指定字符
(公开成员函数)
访问指定字符,带有边界检查
(公开成员函数)
访问首个字符
(公开成员函数)
访问最末字符
(公开成员函数)
返回指向视图首字符的指针
(公开成员函数)
容量
返回字符数
(公开成员函数)
返回最大字符数
(公开成员函数)
检查视图是否为空
(公开成员函数)
修改器
以后移起点收缩视图
(公开成员函数)
以前移终点收缩视图
(公开成员函数)
交换内容
(公开成员函数)
操作
复制字符
(公开成员函数)
返回子串
(公开成员函数)
比较二个视图
(公开成员函数)
检查 string_view 是否始于给定前缀
(公开成员函数)
(C++20)
检查 string_view 是否终于给定后缀
(公开成员函数)
(C++23)
检查字符串视图是否含有给定的子串或字符
(公开成员函数)
在视图中查找字符
(公开成员函数)
寻找子串的最后一次出现
(公开成员函数)
查找字符的首次出现
(公开成员函数)
查找字符的最后一次出现
(公开成员函数)
查找字符的首次不出现
(公开成员函数)
查找字符的最后一次不出现
(公开成员函数)

常量

[静态]
特殊值。准确含义依赖于语境。
(公开静态成员常量)

非成员函数

(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20)
以字典序比较两个字符串视图
(函数模板)
输入/输出
进行字符串视图的流输出
(函数模板)

字面量

定义于内联命名空间 std::literals::string_view_literals
创建一个字符数组字面量的字符串视图
(函数)

辅助类

string_view 的散列支持
(类模板特化)

辅助模板

template<class CharT, class Traits>
inline constexpr bool ranges::enable_borrowed_range<std::basic_string_view<CharT, Traits>> = true;
(C++20 起)

std::ranges::enable_borrowed_range 的此特化使得 basic_string_view 满足 borrowed_range

template<class CharT, class Traits>
inline constexpr bool ranges::enable_view<std::basic_string_view<CharT, Traits>> = true;
(C++20 起)

std::ranges::enable_view 的此特化使得 basic_string_view 满足 view

推导指引(C++20 起)

注解

程序员负责确保 std::string_view 不在被指向数组的生存期外继续生存:

std::string_view good("a string literal");   // OK : "good" 指向静态数组
std::string_view bad("a temporary string"s); // "bad" 保有悬垂指针

即使在 C++23 中引入的正式要求前,所有既存实现中 std::basic_string_view 的特化已经为可平凡复制类型。

示例

#include <iostream>
#include <string_view>
 
int main() {
    constexpr std::string_view unicode[] {
        "▀▄─", "▄▀─", "▀─▄", "▄─▀"
    };
 
    for (int y{}, p{}; y != 6; ++y, p = ((p + 1) % 4)) {
        for (int x{}; x != 16; ++x)
            std::cout << unicode[p];
        std::cout << '\n';
    }
}

可能的输出:

▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─
▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─
▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄
▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀
▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─
▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─