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 的特化都是 TriviallyCopyable 类型。

(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 是相同类型,因为字符串视图是对常量字符序列的视图。

所有对 Container 迭代器类型的要求同样适用于 iterator const_iterator 类型在 basic_string_view 中的使用。

数据成员

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

成员函数

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

常量

[static]
特殊值。具体含义取决于上下文
(公开静态成员常量)

非成员函数

(C++17) (C++20中移除) (C++20中移除) (C++20中移除) (C++20中移除) (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++ 标准。

DR 适用版本 发布行为 正确行为
LWG 3203 C++17 仅成员函数返回的指针、迭代器和引用
可能失效
所有指向 basic_string_view 元素的
指针、迭代器和引用均可能失效

另请参阅

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