当前位置: 首页 > ds >正文

c++string

在 C++ 编程中,std::string 是处理字符串的核心工具。它封装了 C 风格字符串(以 \0 结尾的字符数组)的复杂性,提供了更安全、更高效的字符串操作方式。本文将从基础到进阶,全面解析 std::string 的使用方法,并通过大量示例帮助你快速掌握。


 一、std::string 的优势

  1. 自动内存管理:不需要手动分配或释放内存,避免内存泄漏。
  2. 丰富的操作接口:支持拼接、查找、替换、删除等常见操作。
  3. 安全性:提供越界检查(如 at() 方法)和异常处理。
  4. 兼容性:可与 C 风格字符串无缝交互(如 c_str())。
  5. 动态扩展:根据需要自动调整内部存储容量。

二、std::string 的构造与初始化

1. 默认构造

#include <iostream>
#include <string>
using namespace std;int main() {string s1; // 创建空字符串cout << "s1: " << s1 << ", size: " << s1.size() << endl;return 0;
}

输出:

s1: , size: 0

2. 拷贝构造

string s2 = "Hello"; // 用字符串字面量初始化
string s3 = s2;      // 用另一个 string 对象初始化
cout << "s3: " << s3 << endl;

3. 子串构造

string s4("Hello World", 6); // 从第 0 个字符开始取 6 个字符
cout << "s4: " << s4 << endl; // 输出 "Hello"

4. 填充构造

string s5(5, 'A'); // 创建 5 个 'A' 组成的字符串
cout << "s5: " << s5 << endl; // 输出 "AAAAA"

三、基本操作

1. 赋值

string s;
s = "New String"; // 使用 = 赋值
s.assign("Another String"); // 使用 assign 方法
s.assign("ABC", 3); // 从 "ABC" 的前 3 个字符赋值
cout << "s: " << s << endl;

2. 连接

string s1 = "Hello";
string s2 = "World";
string s3 = s1 + " " + s2; // 使用 + 运算符
cout << "s3: " << s3 << endl; // 输出 "Hello World"

3. 比较

if (s1 == s2) {cout << "s1 == s2" << endl;
} else {cout << "s1 != s2" << endl;
}// 使用 compare 方法
int result = s1.compare(s2);
if (result < 0) cout << "s1 < s2" << endl;
else if (result == 0) cout << "s1 == s2" << endl;
else cout << "s1 > s2" << endl;

 四、常用成员函数

1. 访问字符

string s = "Hello";
cout << "s[0]: " << s[0] << endl; // 不检查越界
cout << "s.at(5): " << s.at(5) << endl; // 检查越界,越界抛出 out_of_range 异常

2. 查找

string s = "Hello World";
size_t pos = s.find("World"); // 查找子串 "World"
if (pos != string::npos) {cout << "Found at position: " << pos << endl;
}

3. 替换

s.replace(6, 5, "Universe"); // 从第 6 位开始替换 5 个字符
cout << "After replace: " << s << endl; // 输出 "Hello Universe"

4. 删除

s.erase(6, 8); // 删除从第 6 位开始的 8 个字符
cout << "After erase: " << s << endl; // 输出 "Hello "

5. 插入

s.insert(5, " Beautiful"); // 在第 5 位插入 " Beautiful"
cout << "After insert: " << s << endl; // 输出 "Hello Beautiful World"

6. 截取子串

string sub = s.substr(6, 9); // 从第 6 位开始取 9 个字符
cout << "Substring: " << sub << endl; // 输出 "Beautiful"

 五、性能优化技巧

1. 避免频繁修改字符串

string s;
for (int i = 0; i < 1000; ++i) {s += to_string(i); // 频繁追加可能导致多次内存分配
}

优化:预分配足够内存:

s.reserve(10000); // 预留 10000 字符的容量

2. 使用 c_str() 与 C 风格字符串交互

const char* cstr = s.c_str(); // 返回以 '\0' 结尾的 C 风格字符串

六、常见问题与解决方案

1. 字符串拼接效率问题

问题:频繁使用 += 可能导致多次内存分配。解决:使用 reserve() 预分配内存,或一次性构建字符串。

2. 如何处理嵌入式 \0

std::string 可以包含嵌入式 \0,但 c_str() 会在第一个 \0 截断。需要手动处理。

3. 如何将数字转换为字符串?

使用 std::to_string()

int num = 123;
string s = to_string(num);

4. 如何将字符串转换为数字?

使用 std::stoistd::stol 等:

string s = "456";
int num = stoi(s);

七、实战示例

1. 统计字符串中的单词数量

#include <sstream>
#include <iostream>
#include <string>
using namespace std;int main() {string input = "Hello World from C++";istringstream iss(input);int count = 0;string word;while (iss >> word) {++count;}cout << "Word count: " << count << endl;return 0;
}

2. 替换所有出现的子串

#include <iostream>
#include <string>
using namespace std;void replaceAll(string& s, const string& oldSub, const string& newSub) {size_t pos = 0;while ((pos = s.find(oldSub, pos)) != string::npos) {s.replace(pos, oldSub.size(), newSub);pos += newSub.size(); // 移动到新插入位置}
}int main() {string s = "Hello Hello World";replaceAll(s, "Hello", "Hi");cout << "After replacement: " << s << endl; // 输出 "Hi Hi World"return 0;
}

八、总结

std::string 是 C++ 中处理字符串的核心工具,其设计兼顾了安全性、效率和灵活性。通过本文的学习,你应该已经掌握了以下内容:

  1. 构造与初始化:多种方式创建字符串。
  2. 基本操作:赋值、连接、比较等。
  3. 常用函数:查找、替换、删除、插入等。
  4. 性能优化:避免频繁修改字符串,合理使用内存预分配。
  5. 实战应用:字符串流处理、子串替换等。

建议:多动手实践,尝试用 std::string 解决实际问题(如文件读取、数据解析等),逐步提升对字符串操作的熟练度。

http://www.xdnf.cn/news/18786.html

相关文章:

  • crypto.randomUUID is not a function
  • 拓扑排序|hash
  • frp+go-mmproxy 实现透明代理的内网穿透
  • Qt5 高级功能
  • 关于说明锂电池充电芯片实际应用
  • 曲面方程的三维可视化:从数学解析到Python实现
  • 从罗永浩访谈李想中学习现代家庭教育智慧
  • 定时器互补PWM输出和死区
  • 54.Redis持久化-AOF
  • JEI(Journal of Electronic lmaging)SCI四区期刊
  • 控制建模matlab练习16:线性状态反馈控制器-⑤轨迹追踪
  • Linux内核进程管理子系统有什么第三十三回 —— 进程主结构详解(29)
  • 【KO】前端面试四
  • Java八股文-java基础面试题
  • 9.Shell脚本修炼手册---数值计算实践
  • 使用tensorRT10部署yolov5目标检测模型(2)
  • UE5.3 中键盘按键和操作绑定
  • 青少年机器人技术(六级)等级考试试卷-实操题(2021年12月)
  • 深入理解3x3矩阵
  • 11.Shell脚本修炼手册---IF 条件语句的知识与实践
  • 【数据结构】布隆过滤器的概率模型详解及其 C 代码实现
  • mysql没有mvcc之前遇到了什么问题
  • 2025年AI Agent规模化落地:企业级市场年增超60%,重构商业作业流程新路径
  • Hive中的join优化
  • 基于SpringBoot的招聘系统源码
  • 解决Conda访问官方仓库失败:切换国内镜像源的详细教程
  • STAR-CCM+|K-epsilon湍流模型溯源
  • GEO优化供应商:AI搜索时代的“答案”构建与移山科技的引领,2025高性价比实战指南
  • 基于大模型的对话式推荐系统技术架构设计
  • Linux服务环境搭建指南