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_typeTraits
value_typeCharT
pointerCharT*
const_pointerconst CharT*
referenceCharT&
const_referenceconst CharT&
const_iterator实现定义的常量老式随机访问迭代器 (LegacyRandomAccessIterator)
老式连续迭代器 (LegacyContiguousIterator) (C++20 前)
常量表达式迭代器 (ConstexprIterator) contiguous_iterator(C++20 起)

,它的 value_typeCharT

iteratorconst_iterator
const_reverse_iteratorstd::reverse_iterator<const_iterator>
reverse_iteratorconst_reverse_iterator
size_typestd::size_t
difference_typestd::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_view201606L(C++17)std::string_view
201803L(C++20)常量表达式迭代器 (ConstexprIterator)
__cpp_lib_string_contains202011L(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 3203C++17只有从 basic_string_view 的成员函数
返回的指针、迭代器和引用才会失效
所有到 basic_string_view
元素的指针、迭代器和引用都会失效

参阅

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