std::basic_string
| 在標頭 <string> 定義
|
||
| |
(1) | |
| |
(2) | (C++17 起) |
類模板 basic_string 存儲和處理字符式對象的序列,這種對象是滿足平凡類型 (TrivialType) 和標準佈局類型 (StandardLayoutType) 的非數組對象。該類既不依賴字符類型,也不依賴該類型上的原生操作。操作的定義通過 Traits 模板形參(std::char_traits 的特化或兼容的特徵類)提供。
basic_string 的元素是連續存儲的,即對於 basic_string s,對 [0, s.size()) 中的任意 n 有 &*(s.begin() + n) == &*s.begin() + n,或等價地,指向 s[0] 的指針能傳遞給期待指向 CharT 的空終止(C++11 起)數組首元素指針的函數。
std::basic_string 滿足知分配器容器 (AllocatorAwareContainer) (但不使用定製的 construct/destroy 構造/析構元素)、���列容器 (SequenceContainer) 及連續���器 (ContiguousContainer) (C++17 起)。
如果 Traits::char_type 或者 Allocator::char_type 與 CharT 不同,那麼程序非良構。
|
然而, |
(C++20 起) |
提供數個對於常用字符類型的 typedef:
在標頭
<string> 定義 | |
| 類型 | 定義 |
std::string
|
std::basic_string<char>
|
std::wstring
|
std::basic_string<wchar_t>
|
std::u8string (C++20)
|
std::basic_string<char8_t>
|
std::u16string (C++11)
|
std::basic_string<char16_t>
|
std::u32string (C++11)
|
std::basic_string<char32_t>
|
std::pmr::string (C++17)
|
std::pmr::basic_string<char>
|
std::pmr::wstring (C++17)
|
std::pmr::basic_string<wchar_t>
|
std::pmr::u8string (C++20)
|
std::pmr::basic_string<char8_t>
|
std::pmr::u16string (C++17)
|
std::pmr::basic_string<char16_t>
|
std::pmr::u32string (C++17)
|
std::pmr::basic_string<char32_t>
|
模板形參
| CharT | - | 字符類型 |
| Traits | - | 指定字符類型上操作的特性類 |
| Allocator | - | 用於分配內部存儲的分配器 (Allocator) 類型 |
嵌套類型
| 類型 | 定義 | ||||
traits_type
|
Traits
| ||||
value_type
|
CharT
| ||||
allocator_type
|
Allocator
| ||||
size_type
|
| ||||
difference_type
|
| ||||
reference
|
value_type&
| ||||
const_reference
|
const value_type&
| ||||
pointer
|
| ||||
const_pointer
|
| ||||
iterator
|
| ||||
const_iterator
|
| ||||
reverse_iterator
|
std::reverse_iterator<iterator>
| ||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator>
|
數據成員
constexpr size_type npos [靜態]
|
特殊值 size_type(-1),它的確切含義依賴語境
|
成員函數
構造 basic_string (公開成員函數) | |
| 銷毀字符串,若使用了內部存儲則解分配之 (公開成員函數) | |
| 為字符串賦值 (公開成員函數) | |
| 賦值字符給字符串 (公開成員函數) | |
(C++23) |
賦值範圍內的字符到字符串 (公開成員函數) |
| 返回關聯的分配器 (公開成員函數) | |
元素訪問 | |
| 訪問指定字符,有邊界檢查 (公開成員函數) | |
| 訪問指定字符 (公開成員函數) | |
(DR*) |
訪問首字符 (公開成員函數) |
(DR*) |
訪問最後的字符 (公開成員函數) |
| 返回指向字符串首字符的指針 (公開成員函數) | |
| 返回字符串的不可修改的標準 C 字符數組版本 (公開成員函數) | |
(C++17) |
返回到整個字符串的不可修改的 basic_string_view (公開成員函數) |
迭代器 | |
(C++11) |
返回指向起始的迭代器 (公開成員函數) |
(C++11) |
返回指向末尾的迭代器 (公開成員函數) |
(C++11) |
返回指向起始的逆向迭代器 (公開成員函數) |
(C++11) |
返回指向末尾的逆向迭代器 (公開成員函數) |
容量 | |
| 檢查字符串是否為空 (公開成員函數) | |
| 返回字符數 (公開成員函數) | |
| 返回字符數的最大值 (公開成員函數) | |
| 預留存儲 (公開成員函數) | |
| 返回當前對象分配的存儲空間能保存的字符數量 (公開成員函數) | |
| 通過釋放不使用內存減少內存使用 (公開成員函數) | |
修改器 | |
| 清除內容 (公開成員函數) | |
| 插入字符 (公開成員函數) | |
(C++23) |
插入範圍內的字符 (公開成員函數) |
| 移除字符 (公開成員函數) | |
| 後附字符到結尾 (公開成員函數) | |
(DR*) |
移除末尾字符 (公開成員函數) |
| 後附字符到結尾 (公開成員函數) | |
(C++23) |
後附範圍內的字符到結尾 (公開成員函數) |
| 後附字符到結尾 (公開成員函數) | |
| 替換字符串的指定部分 (公開成員函數) | |
(C++23) |
以範圍中的字符替換字符串的指定部分 (公開成員函數) |
| 複製字符 (公開成員函數) | |
| 更改存儲的字符數 (公開成員函數) | |
(C++23) |
更改存儲的字符數並可能經由用戶提供的操作重寫不確定的內容 (公開成員函數) |
| 交換內容 (公開成員函數) | |
查找 | |
| 尋找給定子串的首次出現 (公開成員函數) | |
| 尋找子串的最後一次出現 (公開成員函數) | |
| 尋找字符的首次出現 (公開成員函數) | |
| 尋找字符的首次缺失 (公開成員函數) | |
| 尋找字符的最後一次出現 (公開成員函數) | |
| 尋找字符的最後一次缺失 (公開成員函數) | |
操作 | |
| 比較兩個字符串 (公開成員函數) | |
(C++20) |
檢查字符串是否始於給定前綴 (公開成員函數) |
(C++20) |
檢查字符串是否終於給定後綴 (公開成員函數) |
(C++23) |
檢查字符串是否含有給定的子串或字符 (公開成員函數) |
| 返回子串 (公開成員函數) | |
非成員函數
連接兩個字符串,一個字符串和一個 char,或者一個字符串和一個 std::string_view (函數模板) | |
(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20) |
以字典序比較兩個字符串 (函數模板) |
| 特化 std::swap 算法 (函數模板) | |
| 擦除所有滿足特定判別標準的元素 (函數模板) | |
輸入/輸出 | |
| 執行字符串的流輸入與輸出 (函數模板) | |
| 從輸入/輸出流讀取數據到字符串 (函數模板) | |
數值轉換 | |
(C++11)(C++11)(C++11) |
轉換字符串為有符號整數 (函數) |
(C++11)(C++11) |
轉換字符串為無符號整數 (函數) |
(C++11)(C++11)(C++11) |
轉換字符串為浮點數 (函數) |
(C++11) |
轉換整數或浮點數為 string (函數) |
(C++11) |
轉換整數或浮點數為 wstring (函數) |
字面量
在內聯命名空間
std::literals::string_literals 定義 | |
(C++14) |
轉換字符數組字面量為 basic_string (函數) |
輔助類
(C++11) |
字符串的散列支持 (類模板特化) |
推導指引 (C++17 起)
迭代器失效
指代 basic_string 元素的引用、指針和迭代器,可能會因任何接受非 const basic_string 的引用的標準庫函數而失效,比如 std::getline、std::swap 或 operator>>,或因調用除了 operator[]、at、data、front、back、begin、rbegin、end 和 rend 之外的非 const 成員函數而失效。
註解
儘管在 C++23 前要求在構造或銷毀 std::basic_string 的元素時使用定製的 construct 或 destroy,所有實現都使用默認機制。P1072R10 更正了該要求以匹配既存實踐。
| 功能特性測試宏 | 值 | 標準 | 功能特性 |
|---|---|---|---|
__cpp_lib_string_udls |
201304L |
(C++14) | 字符串類型的用戶定義字面量 |
__cpp_lib_starts_ends_with |
201711L |
(C++20) | starts_with 和 ends_with
|
__cpp_lib_constexpr_string |
201907L |
(C++20) | constexpr 的 std::basic_string
|
__cpp_lib_char8_t |
201907L |
(C++20) | std::u8string
|
__cpp_lib_erase_if |
202002L |
(C++20) | erase 和 erase_if
|
__cpp_lib_string_contains |
202011L |
(C++23) | contains
|
__cpp_lib_string_resize_and_overwrite |
202110L |
(C++23) | resize_and_overwrite
|
__cpp_lib_containers_ranges |
202202L |
(C++23) | 接受��器兼容範圍的構造、插入、替換成員函數 |
示例
#include <iostream>
#include <string>
int main()
{
using namespace std::literals;
// 从 const char* 创建 string
std::string str1 = "hello";
// 从字符串字面量创建 string
auto str2 = "world"s;
// 拼接 string
std::string str3 = str1 + " " + str2;
// 打印结果
std::cout << str3 << '\n';
std::string::size_type pos = str3.find(" ");
str1 = str3.substr(pos + 1); // 空格后的部分
str2 = str3.substr(0, pos); // 空格前的部分
std::cout << str1 << ' ' << str2 << '\n';
// 用下标运算符 operator[] 访问元素
std::cout << str1[0] << '\n';
str1[0] = 'W';
std::cout << str1 << '\n';
}
輸出:
hello world
world hello
w
World
缺陷報告
下列更���行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
| 缺陷報告 | 應用於 | 出版時的行為 | 正確行為 |
|---|---|---|---|
| LWG 530 | C++98 | LWG259 意外的使得 basic_string 的元素存儲的連續性不被要求
|
再次要求 |
| LWG 2861 | C++98 | value_type 是 Traits::char_type
|
改為 CharT
|
| LWG 2994 (P1148R0) |
C++98 | Traits::char_type[1] 或 Allocator::char_type 與 CharT 不同時的行為未定義
|
此時程序非良構 |
參閱
(C++17) |
只讀的字符串視圖 (類模板) |
外部連結
| C++ string handling |