string的使用1️⃣ 头文件与命名空间代码语言javascriptAI代码解释#include string // 必须包含的头文件 using namespace std; // 或者显式使用 std::string2️⃣ string类对象的常见构造构造函数功能说明string()重点构造空的 string 类对象即空字符串string(const char* s)重点用 C-string 来构造 string 类对象string(size_t n, char c)string 类对象中包含 n 个字符 cstring(const string s)重点拷贝构造函数代码示例如下代码语言javascriptAI代码解释std::string str1; // 默认构造空字符串 std::string str2(Hello); // 用 C 风格字符串初始化 std::string str3 World; // 同上 std::string str4(str2); // 拷贝构造 Hello std::string str5(5, A); // 构造包含 5 个 A 的字符串 AAAAA std::string str6(str2, 1, 3); // 从 Hello 的索引 1 开始取 3 个字符 ell std::string str7(str2, 1); // 如果第三个参数不写的话默认是最大的即nposello std::string str8(str2, 1string::npos); //与上述语句功能完全一致 std::string str9 str2 str3; // 连接构造 Hello World代码语言javascriptAI代码解释size_t string::npos -1;npos就是一个无符号整数的-1无符号整数的特殊值size_t是无符号整数类型通常为unsigned int或unsigned long。当将-1赋值给无符号整数时会发生整数回绕wrap-around结果等于该类型能表示的最大值即所有位全为1的二进制数。实际值在 32 位系统中npos 4,294,967,295即 232−1232−1在 64 位系统中npos 18,446,744,073,709,551,615即 264−1264−13️⃣ string类对象的容量操作函数名称功能说明size重点返回字符串有效字符长度length返回字符串有效字符长度capacity返回空间总大小empty重点检测字符串是否为空串是则返回 true否则返回 falseclear重点清空有效字符reserve重点为字符串预留空间resize重点将有效字符的个数改成 n 个多出的空间用字符 c 填充代码语言javascriptAI代码解释s.reserve(100);//reserve提前开空间但要考虑内存对齐一般都是开给定空间的整数倍 s.resize(100, x);//resize是不光开空间而且将开辟的空间给值不自己设定值默认是\0代码语言javascriptAI代码解释string s(hello world); s.resize(5);//会发生截断 s.resize(20, x);//在hello world后面补充x直至达到20个空间 cout s endl;//也就是说resize是管你空间的你原本就够的给你截断你原本不够的给你补充4️⃣ string类对象的访问及遍历操作函数名称功能说明operator[]重点返回指定位置pos的字符适用于 const string 类对象begin end迭代器begin 获取第一个字符的迭代器end 获取最后一个字符下一个位置的迭代器rbegin rend反向迭代器rbegin 获取最后一个字符的迭代器rend 获取第一个字符前一个位置的迭代器范围 forC11 支持的更简洁的范围 for 循环遍历方式5️⃣ string类对象的修改操作函数名称功能说明push_back在字符串后尾插字符 cappend在字符串后追加一个字符串operator重点在字符串后追加字符串 strc_str重点返回 C 格式字符串即以 \0 结尾的字符数组find npos重点从字符串 pos 位置开始往后找字符 c返回该字符在字符串中的位置rfind从字符串 pos 位置开始往前找字符 c返回该字符在字符串中的位置substr在字符串中从 pos 位置开始截取 n 个字符然后将其返回代码语言javascriptAI代码解释cout s1 endl;//调用的是string重载的operator 会将对象数组中的所有字符都输出 cout s1.c_str() endl;//直接输出const char*是C语言的形式 遇到\0就会结束 //就会发现cout s1 endl;是会打印完的而cout s1.c_str() endl;只打印到\0处6️⃣ string类非成员函数函数名称功能说明operator尽量少用因为传值返回导致深拷贝效率低operator重点输入运算符重载operator重点输出运算符重载getline重点获取一行字符串relational operators重点大小比较如 , !, , , , 等cin使用 运算符读取输入以空白字符空格、制表符、换行符作为分隔符。遇到空白符时停止读取剩余输入留在缓冲区。getline读取整行输入包括空格以换行符 \n 为结束标志。换行符被读取但不存储到目标变量中。代码语言javascriptAI代码解释int main() { string s1, s2; cout Enter a string for cin: ; cin s1; // 输入 Hello Worlds1 只得到 Hello cin.ignore(); // 清除缓冲区残留的换行符 cout Enter a string for getline: ; getline(cin, s2); // 输入 Hello Worlds2 得到完整内容 cout cin: s1 endl; // 输出 Hello cout getline: s2; // 输出 Hello World return 0; }代码示例总结如下赋值代码语言javascriptAI代码解释str1 New Value; // 赋值(重要) str1.assign(Assigned, 3); // 赋值前 3 个字符 Ass访问字符代码语言javascriptAI代码解释char first str2[0]; // H (下标运算符不检查边界) const char* cstr str2.c_str(); // 获取指向内部 C 风格字符串的指针 (只读内容可能随 str2 改变而失效) ---------------------下面不常用--------------------------------------------------------- char second str2.at(1); // e (at 方法会检查边界越界抛 std::out_of_range) char last str2.back(); // o (C11) char first str2.front(); // H (C11) const char* dataptr str2.data(); // 类似 c_str() (C11 起data() 在非 const string 上也返回 const char*直到 C17 才有非 const 版本)修改内容代码语言javascriptAI代码解释str2 C; // 追加 C - Hello C (operator) str2.insert(5, dear); // 在索引 5 处插入 dear - Hello dear C!!! str2.erase(5, 5); // 从索引 5 开始删除 5 个字符 - Hello C!!! str2.clear(); // 清空字符串 - str2.resize(10, X); // 改变大小为 10不足部分用 X 填充 - XXXXXXXXXX str2.append(!!!); // 追加 !!! - Hello C!!! str2.push_back(!); // 追加单个字符 ! str2.replace(6, 3, Standard); // 从索引 6 开始替换 3 个字符 (C) 为 Standard - Hello Standard!!! //插入一般喜欢用查找代码语言javascriptAI代码解释size_t pos1 str.find(World); // 查找子串 World 首次出现的位置找不到返回 std::string::npos size_t pos2 str.find(lo, 1); // 从索引 1 开始查找 lo size_t pos3 str.rfind(l); // 查找 l 最后一次出现的位置 size_t pos4 str.find_first_of(aeiou); // 查找 a, e, i, o, u 中任意一个首次出现的位置 size_t pos5 str.find_first_not_of(0123456789); // 查找第一个非数字字符的位置 // 类似的有 find_last_of, find_last_not_of应用场景如分离网址:代码语言javascriptAI代码解释//取文件后缀名 void test_string1() { string s1(string.cpp); string s2(string.c); string s3(string.txt); size_t pos1 s1.find(.);//如果没找到的话返回的就是无符号整型的最大值 if (pos1 ! string::npos) { cout s1.substr(pos1) endl; } size_t pos2 s2.find(.); if (pos2 ! string::npos) { cout s2.substr(pos1) endl; } } //分离网址 void test_string2() { string habcsdnurl(https://blog.csdn.net/qq_53706413?spm1011.2124.3001.5343); string url habcsdnurl; //分离url 协议 域名 资源名称 size_t pos1 url.find(:); if (pos1 ! string::npos) { cout url.substr(0, pos1) endl; } size_t pos2 url.find(/, pos1 3); if (pos2 ! string::npos) { cout url.substr(pos1 3, pos2 - (pos1 3)) endl; } cout url.substr(pos21); }子串提取代码语言javascriptAI代码解释std::string sub1 str.substr(6); // 从索引 6 开始到结尾的子串 (Standard!!!) std::string sub2 str.substr(6, 8); // 从索引 6 开始长度为 8 的子串 (Standard)比较代码语言javascriptAI代码解释if (str1 str2) { ... } // 相等比较 if (str1 ! str3) { ... } // 不等比较 if (str1 str4) { ... } // 小于比较 (字典序) int result str1.compare(str2); // 返回 0(相等), 0(str1str2), 0(str1str2) int result str1.compare(0, 3, Hel); // 比较 str1 的前 3 个字符和 Hel大小与容量代码语言javascriptAI代码解释size_t len str.size(); // 或 str.length(), 当前字符数 bool isEmpty str.empty(); // 是否为空字符串 (size() 0) size_t cap str.capacity(); // 当前已分配的内存能容纳的字符数 (通常 size()) str.reserve(100); // 请求预留至少 100 字符的容量 (优化后续操作减少重新分配) str.shrink_to_fit(); // 请求减少 capacity() 到 size() (C11, 请求非强制)输入/输出代码语言javascriptAI代码解释std::cout str std::endl; // 输出字符串 std::cin str; // 读取一个单词 (遇空格/换行停止) std::getline(std::cin, str); // 读取一整行 (包括空格直到换行符)事实上string的接口非常多穷举都要举办天所以一般我们会用一些常见的就够用了对于不常见的碰到了查文档就可以三、 string的模拟实现上述对于它的使用是第一层次的当我们会用之后可以进入下一层对它的底层实现加以了解这会在我们使用它的时候更加得心应手事实上校招找工作的时候会场面临着让你简单实现一个string类的情况。