命名空间
变体
操作

std::basic_string_view

来自 cppreference.com
< cpp‎ | string
 
 
 
 
在头文件 <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 起)

典型的实现仅包含两个成员:指向常数 CharT 的指针和大小。

提供了用于常见字符类型的几个 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_string 一样,Traits::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 是相同类型,因为字符串视图是查看常数字符序列的视图。

Container 的迭代器类型的所有要求也适用于 basic_string_viewiteratorconst_iterator 类型。

[编辑] 成员函数

构造函数和赋值
构造一个 basic_string_view
(公共成员函数) [编辑]
分配一个视图
(公共成员函数) [编辑]
迭代器
返回指向开头的迭代器
(公共成员函数) [编辑]
返回指向末尾的迭代器
(公有成员函数) [编辑]
返回指向开头的反向迭代器
(公有成员函数) [编辑]
返回指向结尾的反向迭代器
(公有成员函数) [编辑]
元素访问
访问指定的字符
(公有成员函数) [编辑]
访问指定的字符,并进行边界检查
(公有成员函数) [编辑]
访问第一个字符
(公有成员函数) [编辑]
访问最后一个字符
(公有成员函数) [编辑]
返回指向视图第一个字符的指针
(公有成员函数) [编辑]
容量
返回字符数量
(公有成员函数) [编辑]
返回最大字符数量
(公有成员函数) [编辑]
检查视图是否为空
(公有成员函数) [编辑]
修饰符
通过将视图的起始位置向前移动来缩短视图
(公有成员函数) [编辑]
通过将视图的结束位置向后移动来缩短视图
(公有成员函数) [编辑]
交换内容
(公有成员函数) [编辑]
操作
复制字符
(公有成员函数) [编辑]
返回子字符串
(公有成员函数) [编辑]
比较两个视图
(公有成员函数) [编辑]
检查字符串视图是否以给定前缀开头
(公有成员函数) [编辑]
(C++20)
检查字符串视图是否以给定后缀结尾
(公有成员函数) [编辑]
(C++23)
检查字符串视图是否包含给定的子字符串或字符
(公有成员函数) [编辑]
在视图中查找字符
(公有成员函数) [编辑]
查找子字符串的最后一次出现
(公有成员函数) [编辑]
查找字符的第一次出现
(公有成员函数) [编辑]
查找字符的最后一次出现
(公有成员函数) [编辑]
查找字符第一次不存在的位置
(公有成员函数) [编辑]
查找字符最后一次不存在的位置
(公有成员函数) [编辑]

常量

[静态]
特殊值。确切含义取决于上下文
(公有静态成员常量) [编辑]

[编辑] 非成员函数

(C++17)(在 C++20 中移除)(在 C++20 中移除)(在 C++20 中移除)(在 C++20 中移除)(在 C++20 中移除)(C++20)
按字典顺序比较两个字符串视图
(函数模板) [编辑]
输入/输出
对字符串视图执行流输出
(函数模板) [编辑]

[编辑] 字面量

定义在内联命名空间 std::literals::string_view_literals
创建字符数组字面量的字符串视图
(函数) [编辑]

[编辑] 辅助类

对字符串视图的哈希支持
(类模板特化) [编辑]

[编辑] 辅助模板

template< class CharT, class Traits >

inline constexpr bool

    ranges::enable_borrowed_range<std::basic_string_view<CharT, Traits>> = true;
(自 C++20 起)

此特化版本 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 起)

此特化版本 ranges::enable_view 使 basic_string_view 满足 view

推导指南

(自 C++20 起)

[编辑] 注释

程序员有责任确保 std::string_view 的生命周期不超过所指向的字符数组

std::string_view good{"a string literal"};
    // "Good" case: `good` points to a static array.
    // String literals reside in persistent data storage.
 
std::string_view bad{"a temporary string"s};
    // "Bad" case: `bad` holds a dangling pointer since the std::string temporary,
    // created by std::operator""s, will be destroyed at the end of the statement.

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

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

[编辑] 示例

#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';
    }
}

输出

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

[编辑] 缺陷报告

以下更改行为的缺陷报告已追溯应用于之前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 3203 C++17 仅指针、迭代器和引用
从成员函数返回
basic_string_view 可能失效
所有指针、迭代器和引用
basic_string_view 的元素
可能失效

[编辑] 另请参阅

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