C++字符串处理:STL string终极指南

C++ 字符串处理利器:STL string 保姆级入门教程

1. 为什么需要 string 类?

在 C++ 中,传统的 C 风格字符串(字符数组)存在诸多痛点:

  • 需手动管理内存
  • 长度计算需遍历(时间复杂度 O(n))
  • 拼接/修改易导致缓冲区溢出

STL 的 string 类通过封装解决了这些问题:

cpp 复制代码
#include <string>
using namespace std;

string s = "Hello"; // 自动管理内存
2. 基础操作

初始化

cpp 复制代码
string s1;                // 空字符串
string s2("Hello");       // C 风格字符串初始化
string s3 = "World";      // 赋值初始化
string s4(5, 'A');        // "AAAAA"

常用操作

cpp 复制代码
s2 += " World";           // 拼接:"Hello World"
s2.push_back('!');        // 尾部添加字符:"Hello World!"
char c = s2[0];           // 访问字符:'H'
s2.replace(6, 5, "C++");  // 替换:"Hello C++!"
3. 核心功能详解

长度与容量

cpp 复制代码
int len = s2.size();      // 或 s2.length(),时间复杂度 $O(1)$
int cap = s2.capacity();  // 当前分配的内存空间
s2.reserve(100);          // 预分配内存(优化频繁扩容)

子串操作

cpp 复制代码
string sub = s2.substr(6, 3); // 从位置6取3字符:"C++"
size_t pos = s2.find("C++");   // 查找子串位置:6

C 风格互操作

cpp 复制代码
const char* cstr = s2.c_str(); // 获取只读 C 字符串
char buffer[20];
s2.copy(buffer, 3, 6);        // 复制子串到缓冲区:buffer="C++"
4. 内存管理机制

string 采用动态内存分配策略:

  • 小字符串优化(SSO):短字符串直接存储在对象内部
  • 扩容策略:通常按指数增长(如 1.5 倍),避免频繁重分配
cpp 复制代码
string str;
for (int i = 0; i < 100; ++i) {
    str += 'x'; // 自动扩容,无需手动管理
}
5. 高级技巧

高效拼接

cpp 复制代码
string result;
result.reserve(50); // 预分配避免多次扩容
result.append("Part1");
result.append("Part2");

遍历优化

cpp 复制代码
for (auto& c : s2) { // 范围for循环(C++11)
    c = toupper(c);  // 直接修改字符
}

空字符处理

cpp 复制代码
string s = "Hello\0World"; // 包含空字符
cout << s.size();          // 输出 11(保留空字符)
6. 实战示例:文本处理
cpp 复制代码
string text = "The quick brown fox jumps over the lazy dog";
// 单词拆分
size_t start = 0;
for (size_t pos = 0; pos != string::npos; ) {
    pos = text.find(' ', start);
    string word = text.substr(start, pos - start);
    cout << word << endl;
    start = pos + 1;
}
7. 注意事项
  • 避免 c_str() 失效:任何修改操作后需重新获取
  • 跨线程安全:const 成员函数线程安全,非 const 操作需同步
  • 性能陷阱:连续 += 可能触发多次扩容(用 append() 替代)

通过合理利用 string 的特性,可显著提升字符串处理效率和代码可维护性。建议结合 std::string_view(C++17)进一步优化只读场景性能。

相关推荐
lzhdim4 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ7 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛7 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1148 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
w_zero_one9 小时前
算法--模拟
java·数据结构·算法
Javatutouhouduan9 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David9 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源10 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
秋天的怀念_David10 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool11226610 小时前
网络编程^
java