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 描述一个能指代 CharT 的常量连续序列的对象,序列首元素在零位置。

对于 basic_string_view str,当有操作使得范围 [str.data()str.data() + str.size()) 中的指针失效时,到 str 的元素的指针、迭代器和引用也会失效。

std::basic_string_view 的每个特化都可平凡复制 (TriviallyCopyable)

(C++23 起)

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

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

目录

[编辑] 模板形参

CharT - 字符类型
Traits - 指定字符类型上的操作的字符特征 (CharTraits) 类。同 std::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)
老式连续迭代器 (LegacyContiguousIterator) (C++20 前)
常量表达式迭代器 (ConstexprIterator) contiguous_iterator (C++20 起)

,它的 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 是同一类型,因为 std::string_view 是到常量字符序列中的视图。

容器 (Container) 的迭代器类型上的所有要求同样适用于 std::basic_string_viewiteratorconst_iterator 类型。

[编辑] 数据成员

成员 描述
const_pointer data_ 指向底层序列的指针
(仅用于阐述的成员对象*)
size_type size_ 字符个数
(仅用于阐述的成员对象*)

[编辑] 成员函数

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

常量

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

[编辑] 非成员函数

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

[编辑] 字面量

创建一个字符数组字面量的字符串视图
(函数) [编辑]

[编辑] 辅助类

字符串视图的散列支持
(类模板特化) [编辑]

[编辑] 辅助模板

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 的此特化使得 std::basic_string_view 满足 view

推导指引

(C++20 起)

[编辑] 注解

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

std::string_view good{"a string literal"};
    // “好”的情况:"good" 指向静态数组。
    // 字符串字面量位于持久数据存储中。
 
std::string_view bad{"a temporary string"s};
    // “不好”的情况:"bad" 保有悬垂指针,由于 std::operator""s 所创建的
    // std::string 临时量将在语句末尾销毁。

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

功能特性测试 标准 功能特性
__cpp_lib_string_view 201606L (C++17) std::string_view
201803L (C++20) 常量表达式迭代器 (ConstexprIterator)
__cpp_lib_string_contains 202011L (C++23) contains

[编辑] 示例

#include <iostream>
#include <string_view>
 
int main()
{
    #define A "▀"
    #define B "▄"
    #define C "─"
 
    constexpr std::string_view blocks[]{A B C, B A C, A C B, B C A};
 
    for (int y{}, p{}; y != 8; ++y, p = ((p + 1) % 4))
    {
        for (char x{}; x != 29; ++x)
            std::cout << blocks[p];
        std::cout << '\n';
    }
}

输出:

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

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3203 C++17 只有从 basic_string_view 的成员函数
返回的指针、迭代器和引用才会失效
所有到 basic_string_view
元素的指针、迭代器和引用都会失效

[编辑] 参阅

存储并操作字符序列
(类模板) [编辑]
连接两个字符串,一个字符串和一个 char,或者一个字符串和一个 string_view
(函数模板) [编辑]
(C++20)
连续的对象序列上的无所有权视图
(类模板) [编辑]
引用在列表初始化中创建的临时数组
(类模板) [编辑]