命名空间
变体
操作

std::basic_string_view

来自 cppreference.cn
< 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 起)

典型的实现只保有二个成员:一个指向常量 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 - 字符类型
特性 - 指定字符类型上的操作的 字符特性 (CharTraits) 类。与 std::basic_string 一样,Traits::char_type 必须指名与 CharT 相同的类型,否则程序非良构。

[编辑] 成员类型

嵌套类型 定义
traits_type 特性
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)
按字典序比较两个 string_view
(函数模板) [编辑]
输入/输出
对 string_view 执行流输出
(函数模板) [编辑]

[编辑] 字面量

在内联命名空间 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.

即使在 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()
{
    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++ 标准。

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

[编辑] 参阅

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