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_viewstr,当有操作使得范围 [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_pointerdata_ 指向底层序列的指针
(仅用于阐述的成员对象*)
size_typesize_ 字符个数
(仅用于阐述的成员对象*)

[编辑]成员函数

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

常量

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

[编辑]非成员函数

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

[编辑]字面量

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

[编辑]辅助类

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

[编辑]辅助模板

template<class CharT, class Traits>

inlineconstexprbool

    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>

inlineconstexprbool

    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 3203 C++17 只有从 basic_string_view 的成员函数
返回的指针、迭代器和引用才会失效
所有到 basic_string_view
元素的指针、迭代器和引用都会失效

[编辑]参阅

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