From e665e2442034340ad60cf555df30eff3771d6759 Mon Sep 17 00:00:00 2001 From: e2hang <2099307493@qq.com> Date: Thu, 14 Aug 2025 15:23:14 +0800 Subject: [PATCH] STL-String usage --- STL/STL-String/README.md | 219 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 218 insertions(+), 1 deletion(-) diff --git a/STL/STL-String/README.md b/STL/STL-String/README.md index 32928ff..8eeac64 100644 --- a/STL/STL-String/README.md +++ b/STL/STL-String/README.md @@ -2,6 +2,61 @@ 下面我为你系统总结 `std::string` 的所有常用用法和函数,按类别分类,力求全面: +好的,我帮你整理一个 **C++ `std::string` 方法大全表格**,把常用方法、功能、参数和示例都列清楚,方便快速查阅。 + +| 方法 / 操作 | 功能说明 | 参数 | 返回值 / 备注 | 示例 | +| --------------------------------------------------------- | ---------- | ------------------------------------------------- | ---------------------------- | ------------------------------------------------------ | +| 构造 | 创建字符串 | `string s;`、`string s("abc");`、`string s(5,'x');` | - | `string s(3,'a'); // "aaa"` | +| `size()` / `length()` | 字符串长度 | 无 | `size_t` | `s.size();` | +| `empty()` | 是否为空 | 无 | `bool` | `s.empty();` | +| `operator[]` | 访问字符 | 索引 | `char&` | `s[0]='H';` | +| `at()` | 安全访问字符 | 索引 | `char&`,越界抛异常 | `s.at(1);` | +| `front()` / `back()` | 第一个/最后一个字符 | 无 | `char&` | `s.front();` | +| `push_back(c)` | 添加字符到末尾 | `char c` | void | `s.push_back('!');` | +| `pop_back()` | 删除末尾字符 | 无 | void | `s.pop_back();` | +| `append(str)` / `+=` | 拼接字符串 | `string` / `char*` | void | `s += "abc";` / `s.append("def");` | +| `insert(pos, str)` / `insert(it, c)` | 插入字符串或字符 | 位置 / 迭代器,字符串或字符 | void | `s.insert(2,"XY");` | +| `erase(pos, len)` / `erase(it)` | 删除部分或单字符 | 位置和长度 / 迭代器 | void | `s.erase(0,3);` | +| `replace(pos, len, str)` | 替换子串 | 位置,长度,字符串 | void | `s.replace(0,2,"Hi");` | +| `clear()` | 清空字符串 | 无 | void | `s.clear();` | +| `substr(pos, len)` | 子串 | 位置和长度 | `string` | `s.substr(1,3);` | +| `find(str)` / `rfind(str)` | 查找子串 | 字符串 | 索引/`npos` | `s.find("ab");` | +| `find_first_of(str)` / `find_last_of(str)` | 查找字符集合 | 字符串 | 索引/`npos` | `s.find_first_of("aeiou");` | +| `compare(str)` | 字符串比较 | 字符串 | <0 / 0 / >0 | `s1.compare(s2);` | +| `c_str()` | 转 C 风格字符串 | 无 | `const char*` | `cout << s.c_str();` | +| `stoi(s)` / `stol(s)` / `stoll(s)` | 字符串转整数 | 字符串 | int / long / long long | `int n = stoi("123");` | +| `stof(s)` / `stod(s)` / `stold(s)` | 字符串转浮点 | 字符串 | float / double / long double | `double d = stod("3.14");` | +| `to_string(val)` | 数值转字符串 | 数值类型 | string | `string s = to_string(42);` | +| `begin()` / `end()` | 迭代器 | 无 | iterator | `for(auto it=s.begin(); it!=s.end(); ++it)` | +| `rbegin()` / `rend()` | 反向迭代器 | 无 | reverse\_iterator | `reverse(s.rbegin(), s.rend());` | +| `swap(s2)` | 交换字符串 | string | void | `s1.swap(s2);` | +| `resize(n, c)` | 改变长度 | 新长度, 可选填充字符 | void | `s.resize(5,'x');` | +| `reserve(n)` | 预留容量 | 整数 | void | `s.reserve(100);` | +| `capacity()` | 当前容量 | 无 | size\_t | `s.capacity();` | +| `shrink_to_fit()` | 压缩容量 | 无 | void | `s.shrink_to_fit();` | +| `sort(begin,end)` / `reverse(begin,end)` | 排序/反转 | 迭代器区间 | void | `sort(s.begin(),s.end()); reverse(s.begin(),s.end());` | +| `isalpha(c)` / `isdigit(c)` / `toupper(c)` / `tolower(c)` | 字符操作 | 字符 | bool / char | `toupper('a');` | + +--- + +💡 **额外提示**: + +1. `string` 是动态数组,可以用迭代器操作像 `vector` 一样。 +2. 可以用范围 `for` 遍历: + +```cpp +for(char c : s) cout << c; +``` + +3. 没有 `push_front`,插入开头用 `insert(s.begin(), c)` +4. 与 C 风格字符串互转:`c_str()` 和 `string(s)` + +--- + +如果你愿意,我可以帮你画一个**图解版“string 功能地图”**,把 **初始化、访问、修改、拼接、查找、转换、迭代、IO** 全部画成一张图,视觉化一看就懂。 + +你想要我画吗? + --- ### 🔹 1. **构造函数** @@ -295,4 +350,166 @@ int main() { --- -如你需要,我可以给出一份“对比总结笔记表格(Markdown/LaTeX/PDF)”或演示更复杂转换例子。要吗? +好的,我们来整理一个 **C++ `std::string` 的使用大全**,我会尽量覆盖几乎所有常用操作、方法和用法,包括初始化、访问、修改、查找、比较、输入输出、拼接、转换等,并附带示例。 + +--- + +# **C++ `std::string` 使用大全** + +```cpp +#include +#include +#include +#include +using namespace std; + +int main() { + // ================================ + // 1. 初始化 + // ================================ + string s1; // 空字符串 + string s2("Hello"); // 用 C 风格字符串初始化 + string s3(s2); // 拷贝构造 + string s4(5, 'x'); // 生成 "xxxxx" + + // ================================ + // 2. 访问字符 + // ================================ + char c1 = s2[0]; // 'H' + char c2 = s2.at(1); // 'e',越界会抛异常 + char &ref = s2[0]; // 可修改 + s2[0] = 'h'; // 修改为 "hello" + + // ================================ + // 3. 拼接 + // ================================ + string s5 = s2 + " world"; // "hello world" + s2 += "!"; // "hello!" + s2.append(" C++"); // "hello! C++" + + // 插入 + s2.insert(6, "my "); // "hello!my C++" + + // ================================ + // 4. 删除 + // ================================ + s2.erase(6, 3); // 从位置6删除3个字符 + s2.pop_back(); // 删除最后一个字符 + + // ================================ + // 5. 长度与大小 + // ================================ + size_t len = s2.length(); // 字符串长度 + size_t size = s2.size(); // 同 length() + bool empty = s2.empty(); // 是否为空 + + // ================================ + // 6. 查找 + // ================================ + size_t pos1 = s2.find("llo"); // 返回子串位置,找不到返回 npos + size_t pos2 = s2.rfind("o"); // 从右往左查找 + size_t pos3 = s2.find_first_of("aeiou"); // 找到第一个元音字母 + size_t pos4 = s2.find_last_of("aeiou"); // 找到最后一个元音字母 + + // ================================ + // 7. 比较 + // ================================ + string a = "abc", b = "abd"; + int cmp = a.compare(b); // <0 a0 a>b + + // ================================ + // 8. 子串 + // ================================ + string sub = s2.substr(0, 5); // 从位置0开始,长度5 + + // ================================ + // 9. 转换 + // ================================ + string strNum = "123"; + int num = stoi(strNum); // string -> int + long long ll = stoll(strNum); // string -> long long + float f = stof("3.14"); // string -> float + double d = stod("3.14159"); // string -> double + string str1 = to_string(456); // int -> string + + // ================================ + // 10. 排序/反转 + // ================================ + reverse(s2.begin(), s2.end()); // 反转字符串 + sort(s2.begin(), s2.end()); // 字典序排序 + + // ================================ + // 11. 遍历 + // ================================ + for(char ch : s2) cout << ch << " "; // 范围 for + for(size_t i = 0; i < s2.size(); i++) cout << s2[i]; + + // ================================ + // 12. 插入/删除字符操作 + // ================================ + s2.push_back('!'); // 在末尾加字符 + s2.insert(s2.begin(), 'H'); // 在开头插入字符 + s2.erase(s2.begin()); // 删除开头字符 + + // ================================ + // 13. 比较大小/字典序 + // ================================ + if("abc" < "abd") cout << "abc < abd"; + + // ================================ + // 14. 清空 + // ================================ + s2.clear(); // 清空字符串 + + // ================================ + // 15. 转换为 C 风格字符串 + // ================================ + const char* cstr = s2.c_str(); + + // ================================ + // 16. 替换 + // ================================ + s2.replace(0, 3, "HELLO"); // 将前3个字符替换成 HELLO + + // ================================ + // 17. 字符判断/转换 + // ================================ + for(char &ch : s2) { + if(isalpha(ch)) ch = toupper(ch); // 转大写 + } + + // ================================ + // 18. 流操作 + // ================================ + string input; + cin >> input; // 读取单个单词 + getline(cin, input); // 读取整行 + cout << input << endl; + + return 0; +} +``` + +--- + +## ✅ 总结 + +`std::string` 能做的事情非常多,大体可分为: + +1. **初始化/赋值/复制** +2. **访问/修改字符** +3. **拼接、插入、删除、替换** +4. **长度、空性检查** +5. **查找、子串、比较** +6. **遍历** +7. **转换类型** +8. **排序、反转、大小写转换** +9. **C 风格字符串接口** +10. **输入输出** + +--- + +如果你愿意,我可以帮你画一张\*\*`string` 方法总结表格\*\*,把**所有方法、功能、返回值和示例**一页就能看到,像官方手册一样直观。 + +你想让我画吗? +