底层数据结构

连续内存的动态字符数组,类似 vector<char> 但针对字符串场景做了大量扩展。通常采用 SSO(Small String Optimization):短字符串直接存储在对象内部栈空间,避免堆分配;超过阈值才在堆上分配。

复杂度

操作复杂度说明
operator[]O(1)无边界检查
at(i)O(1)带边界检查,越界抛 out_of_range
push_back均摊 O(1)追加单字符
pop_backO(1)删除尾字符
insert / eraseO(n)中间插入/删除
findO(n*m) 最坏朴素匹配,n 为主串长 m 为子串长
substrO(count)截取子串,返回新 string
+ 拼接O(n+m)创建新 string
+= / append均摊 O(m)尾部追加,m 为追加长度
size / lengthO(1)两者完全等价
compareO(n)字典序比较

关键方法

方法说明
s[i] / s.at(i)下标访问字符
s.front() / s.back()首/尾字符
s.size() / s.length()字符个数(等价)
s += str / s.append(str)尾部追加
s + str拼接返回新 string
s.find(sub) / s.rfind(sub)正向/反向查找子串
s.find_first_of(chars)查找 chars 中任意字符首次出现
s.find_last_of(chars)查找 chars 中任意字符末次出现
s.substr(pos, count)截取从 pos 起 count 个字符
s.insert(pos, str)在指定位置插入
s.erase(pos, count)删除指定范围
s.replace(pos, count, str)替换指定范围
s.compare(other)字典序比较,返回负/零/正
s.clear()清空字符串
to_string(n)数值转 string
stoi(s) / stod(s)string 转数值

伪代码示例

string s = "hello"

// 追加
s += " world"            // "hello world"

// 查找
pos = s.find("world")    // 返回 6
if pos != npos:
    print "found at " + to_string(pos)

// 截取
sub = s.substr(0, 5)     // "hello"

// 遍历并修改
for each c in s:
    c = toupper(c)

// 读入整行
getline(in, s)

// 数值转换
num_str = to_string(3.14)
val = stoi("12345")

相关链接