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_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 类型。

成员函数

构造函数和赋值
构造 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()
{
    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)
连续的对象序列上的无所有权视图
(类模板)
列表初始化中创建临时数组然后引用它
(类模板)