C++ 標準庫提供的 std::string 並非內置類型,而是定義在 <string> 頭文件中的類模板實例化類型。每個 string 變量都是類對象,內部自動管理動態內存,**長度隨內容動態變化**,無需預先指定容量。
// 1. 默認構造(空串)
std::string s1;
// 2. C 風格字符串初始化
std::string s2 = "hello";
std::string s3("world");
// 3. 拷貝初始化
std::string s4 = s2;
// 4. 部分構造:從 s2 位置 1 開始取 3 個字符
std::string s5(s2, 1, 3); // "ell"
// 5. 重複字符構造
std::string s6(5, 'x'); // "xxxxx"
// 6. 迭代器範圍構造
std::string s7(s2.begin(), s2.end());
'\0' 結尾,長度由 strlen 計算size() 直接返回 O(1)std::string s("a\0b", 3); // 長度為 3std::string a = "hello";
std::string b = "world";
a = b; // 拷貝賦值
a += "!"; // 尾部追加字符
a.append("!!"); // 追加字符串
a + b; // 返回新字符串,不修改原值
// 錯誤:"hello" + "world" // 至少一邊需是 string
支持全部關係運算符(== != < > <= >=),按字典序比較,返回 bool。
std::string s = "abc"; char c1 = s[1]; // 無邊界檢查 char c2 = s.at(1); // 越界拋出 std::out_of_range char c3 = s.front(); // 首字符 char c4 = s.back(); // 尾字符 const char* p = s.c_str(); // C 風格指針,以 '\0' 結尾 const char* p2 = s.data(); // C++11 起同 c_str()
s.size(); // 當前長度 s.length(); // 同 size() s.capacity(); // 當前分配容量 s.empty(); // 是否為空 s.reserve(100); // 預留容量,避免頻繁擴容 s.shrink_to_fit(); // C++11 釋放多餘容量
s.insert(pos, str); // 插入
s.erase(pos, len); // 刪除
s.replace(pos, len, str); // 替換
s.clear(); // 清空內容
s.push_back('x'); // 尾部添加字符
s.pop_back(); // C++11 移除尾部字符
s.find(sub); // 正向查找,返回位置或 npos s.rfind(sub); // 反向查找 s.find_first_of(chars); // 查找任一字符 s.substr(pos, len); // 截取子串
// 定長數組
std::string names[3] = {"Zhang", "Li", "Zhao"};
// 動態數組(推薦)
std::vector<std::string> vec = {"apple", "banana"};
vec.push_back("orange");
優勢:每個元素長度獨立,無需像二維 char 數組那樣固定列寬;無 '\0' 結束符開銷。
reserve()const std::string& 或 std::string_view (C++17)