std::basic_string_view
出自cppreference.com
| 在標頭 <string_view> 定義
|
||
| |
(C++17 起) | |
類模板 basic_string_view 描述一個能指代 CharT 的常量連續序列的對象,序列首元素在零位置。
對於 basic_string_view str,當有操作使得範圍 [str.data(), str.data() + str.size()) 中的指���失效時,到 str 的元素的指針、迭代器和引用也會失效。
|
|
(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_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)
,它的 | ||||
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 是同一類型,因為 std::string_view 是到常量字符序列中的視圖。
容器 (Container) 的迭代器類型上的所有要求同樣適用於 std::basic_string_view 的 iterator 和 const_iterator 類型。
數據成員
| 成員 | 描述 |
const_pointer data_
|
指向底層序列的指針 (僅用於闡述的成員對象*) |
size_type size_
|
字符個數 (僅用於闡述的成員對象*) |
成員函數
構造函數和賦值 | |
構造 basic_string_view (公開成員函數) | |
| 對視圖賦值 (公開成員函數) | |
迭代器 | |
| 返回指向起始位置的迭代器 (公開成員函數) | |
| 返回指向結尾的迭代器 (公開成員函數) | |
| 返回指向起始的反向迭代器 (公開成員函數) | |
| 返回指向結尾的反向迭代器 (公開成員函數) | |
元素訪問 | |
| 訪問指定字符 (公開成員函數) | |
| 訪問指定字符,帶有邊界檢查 (公開成員函數) | |
| 訪問首個字符 (公開成員函數) | |
| 訪問最末字符 (公開成員函數) | |
| 返回指向視圖首字符的指針 (公開成員函數) | |
容量 | |
| 返回字符數 (公開成員函數) | |
| 返回最大字符數 (公開成員函數) | |
| 檢查視圖是否為空 (公開成員函數) | |
修改器 | |
| 通過向前移動起點收縮視圖 (公開成員函數) | |
| 通過向後移動末尾收縮視圖 (公開成員函數) | |
| 交換內容 (公開成員函數) | |
操作 | |
| 複製字符 (公開成員函數) | |
| 返回子串 (公開成員函數) | |
| 比較兩個視圖 (公開成員函數) | |
(C++20) |
檢查字符串視圖是否始於給定前綴 (公開成員函數) |
(C++20) |
檢查字符串視圖是否終於給定後綴 (公開成員函數) |
(C++23) |
檢查字符串視圖是否含有給定的子串或字符 (公開成員函數) |
| 在視圖中查找字符 (公開成員函數) | |
| 尋找子串的最後一次出現 (公開成員函數) | |
| 查找字符的首次出現 (公開成員函數) | |
| 查找字符的最後一次出現 (公開成員函數) | |
| 查找字符的首次不出現 (公開成員函數) | |
| 查找字符的最後一次不出現 (公開成員函數) | |
常量 | |
[靜態] |
特殊值。確切含義依賴於語境。 (公開靜態成員常量) |
非成員函數
(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20) |
以字典序比較兩個字符串視圖 (函數模板) |
輸入/輸出 | |
(C++17) |
進行字符串視圖的流輸出 (函數模板) |
字面量
(C++17) |
創建一個字符數組字面量的字符串視圖 (函數) |
輔助類
| 字符串視圖的散列支持 (類模板特化) |
輔助模板
| |
(C++20 起) | |
std::ranges::enable_borrowed_range 的此特化使得 basic_string_view 滿足 borrowed_range。
| |
(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_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,或者一個字符串和一個 std::string_view (函數模板) | |
(C++20) |
連續的對象序列上的無所有權視圖 (類模板) |
(C++11) |
引用在列表初始化中創建的臨時數組 (類模板) |