Namespaces
Variants

std:: basic_string_view

From cppreference.net
Strings library
Classes
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 的每个特化都是一个 可平凡复制 类型。

(C++23 起)

提供了多种常见字符类型的类型定义:

定义于头文件 <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_type CharT

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

注意: iterator const_iterator 是相同类型,因为字符串视图是对常量字符序列的视图。

容器 迭代器类型的所有要求同样适用于 basic_string_view iterator const_iterator 类型。

数据成员

成员 描述
const_pointer data_ 指向底层序列的指针
( 仅用于说明的成员对象* )
size_type size_ 字符数量
( 仅用于说明的成员对象* )

成员函数

构造函数与赋值操作
构造 basic_string_view
(公开成员函数)
赋值视图
(公开成员函数)
迭代器
返回指向起始位置的迭代器
(公开成员函数)
返回指向末尾位置的迭代器
(公开成员函数)
返回指向起始位置的反向迭代器
(公开成员函数)
返回指向末尾位置的反向迭代器
(公开成员函数)
元素访问
访问指定字符
(公开成员函数)
带边界检查访问指定字符
(公开成员函数)
访问首字符
(公开成员函数)
访问末字符
(公开成员函数)
返回指向视图首字符的指针
(公开成员函数)
容量
返回字符数量
(公开成员函数)
返回最大字符数
(公开成员函数)
检查视图是否为空
(公开成员函数)
修改器
通过前移起始位置缩小视图
(公开成员函数)
通过后移结束位置缩小视图
(公开成员函数)
交换内容
(公开成员函数)
操作
复制字符
(公开成员函数)
返回子串
(公开成员函数)
比较两个视图
(公开成员函数)
检查字符串视图是否以给定前缀开头
(公开成员函数)
(C++20)
检查字符串视图是否以给定后缀结尾
(公开成员函数)

非成员函数

(C++17) (removed in C++20) (removed in C++20) (removed in C++20) (removed in C++20) (removed in C++20) (C++20)
按字典序比较两个字符串视图
(函数模板)
输入/输出
(C++17)
对字符串视图执行流输出操作
(函数模板)

字面量

定义于内联命名空间 std::literals::string_view_literals
从字符数组字面量创建 string view
(函数)

辅助类

字符串视图的哈希支持
(类模板特化)

辅助模板

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`指向静态数组
    // 字符串字面量驻留在持久数据存储中
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()
{
    #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)
对连续对象序列的非拥有视图
(类模板)
引用在 列表初始化 中创建的临时数组
(类模板)