名稱空間
變體
操作

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 起)

典型的實現只保有二個成員:一個指向常量 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 - 字元型別
特性 - 指定字元型別上的操作的 字元特性 (CharTraits) 類。與 std::basic_string 一樣,Traits::char_type 必須指名與 CharT 相同的型別,否則程式非良構。

[編輯] 成員型別

巢狀型別 定義
traits_type 特性
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 是同一型別,因為字串檢視是到常量字元序列的檢視。

所有對容器 (Container) 的迭代器型別的要求也同樣適用於 basic_string_viewiteratorconst_iterator 型別。

[編輯] 成員函式

建構函式與賦值
構造 basic_string_view
(公開成員函式) [編輯]
賦值檢視
(公開成員函式) [編輯]
迭代器
返回指向起始的迭代器
(公開成員函式) [編輯]
返回指向末尾的迭代器
(公開成員函式) [編輯]
返回指向起始的逆向迭代器
(公開成員函式) [編輯]
返回指向末尾的逆向迭代器
(公開成員函式) [編輯]
元素訪問
訪問指定的字元
(公開成員函式) [編輯]
帶邊界檢查訪問指定字元
(公開成員函式) [編輯]
訪問第一個字元
(公開成員函式) [編輯]
訪問最後一個字元
(公開成員函式) [編輯]
返回指向檢視首字元的指標
(公開成員函式) [編輯]
容量
返回字元數
(公開成員函式) [編輯]
返回字元的最大數量
(公開成員函式) [編輯]
檢查檢視是否為空
(公開成員函式) [編輯]
修改器
透過前移其起始位置來收縮檢視
(公開成員函式) [編輯]
通過後移其末尾位置來收縮檢視
(公開成員函式) [編輯]
交換內容
(公開成員函式) [編輯]
操作
複製字元
(公開成員函式) [編輯]
返回子字串
(公開成員函式) [編輯]
比較兩個檢視
(公開成員函式) [編輯]
檢查字串檢視是否以給定字首開頭
(公開成員函式) [編輯]
(C++20)
檢查字串檢視是否以給定字尾結尾
(公開成員函式) [編輯]
(C++23)
檢查字串檢視是否包含給定子字串或字元
(公開成員函式) [編輯]
在檢視中查詢字元
(公開成員函式) [編輯]
查詢子串的最後一次出現
(公開成員函式) [編輯]
查詢字元的首次出現
(公開成員函式) [編輯]
查詢字元的最後一次出現
(公開成員函式) [編輯]
查詢字元的首次缺席
(公開成員函式) [編輯]
查詢字元的最後一次缺席
(公開成員函式) [編輯]

常量

[靜態]
特殊值。確切含義取決於上下文
(公開靜態成員常量) [編輯]

[編輯] 非成員函式

(C++17)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20)
按字典序比較兩個 string_view
(函式模板) [編輯]
輸入/輸出
對 string_view 執行流輸出
(函式模板) [編輯]

[編輯] 字面量

在內聯名稱空間 std::literals::string_view_literals 中定義
建立字元陣列字面量的字串檢視
(函式) [編輯]

[編輯] 輔助類

字串檢視的雜湊支援
(類模板特化) [編輯]

[編輯] 輔助模板

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" case: `good` points to a static array.
    // String literals reside in persistent data storage.
 
std::string_view bad{"a temporary string"s};
    // "Bad" case: `bad` holds a dangling pointer since the std::string temporary,
    // created by std::operator""s, will be destroyed at the end of the statement.

即使在 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)
一個連續物件序列的非擁有檢視
(類模板) [編輯]
引用在列表初始化中建立的臨時陣列
(類模板) [編輯]