C++ STL 核心:string 从入门到精通(面试+源码+OJ实战)
C STL 核心string 从入门到精通面试源码OJ实战标签C、STL、string、C面试、C基础、后端开发摘要本文全面讲解 C string 类包含使用方法、遍历技巧、容量操作、VS/GCC 底层结构、深浅拷贝、写时拷贝、string 模拟实现与高频 OJ 题适合面试备战与工程开发。文章目录C STL 核心string 从入门到精通面试源码OJ实战0 前言1 为什么要学 string1.1 C 语言字符串的痛点1.2 现实需求2 使用 string 的前置准备3 C11 神器auto 范围 forstring 遍历必备3.1 auto 类型推导3.2 范围 for最简洁遍历4 string 核心接口高频必背4.1 构造函数4 个重点4.2 容量操作面试必考4.3 遍历三剑客4.4 修改与查找开发最常用4.5 输入神器getline5 string 底层结构面试高频5.1 VS 下SSO 短字符串优化5.2 GCC 下COW 写时拷贝6 面试必问浅拷贝 vs 深拷贝6.1 浅拷贝坑6.2 深拷贝解决方案6.3 现代写法最优6.4 写时拷贝 COW7 string 模拟实现面试可直接手写8 OJ 实战string 高频题带答案8.1 仅仅反转字母8.2 第一个只出现一次的字符8.3 字符串相加大数加法9 string 核心要点总结背会直接面试10 结尾 引流0 前言不懂 string别说你会用 C。string 是 STL 最基础、最常用、面试最高频的组件没有之一。它解决了 C 语言字符串手动管理内存、接口零散、容易越界的痛点是日常开发与笔试 OJ 的必备工具。这篇文章带你从会用 → 懂原理 → 能手写 → 能面试一次性吃透 string。1 为什么要学 string1.1 C 语言字符串的痛点以\0结尾内存必须自己管理一不小心就越界、泄漏。str 系列函数与字符串分离不符合 OOP 思想。拼接、查找、扩容、比较都很麻烦。1.2 现实需求OJ 字符串题默认用 string。工作开发几乎不用 C 风格字符串。面试必考深浅拷贝、扩容、底层结构、c_str、迭代器失效。2 使用 string 的前置准备#includestringusingnamespacestd;3 C11 神器auto 范围 forstring 遍历必备3.1 auto 类型推导编译期自动推导类型简化迭代器。必须初始化。不能做函数参数不能定义数组。定义引用必须加 。autoa10;// intautopa;// int*autora;// int3.2 范围 for最简洁遍历底层就是迭代器自动遍历、自动结束。string shello;for(autoch:s){// 加 可修改chtoupper(ch);}for(autoch:s){// 只读coutch ;}4 string 核心接口高频必背4.1 构造函数4 个重点string s1;// 空串strings2(hello);// C 字符串构造strings3(5,a);// n 个字符strings4(s2);// 拷贝构造4.2 容量操作面试必考接口作用size() / length()有效字符长度capacity()底层容量empty()是否为空clear()清空有效字符不缩容reserve(n)预分配空间不改 sizeresize(n, c)改有效长度多出来用 c 填充一句话区分reserve只扩容不改长度resize改长度会初始化4.3 遍历三剑客下标[]for(inti0;is.size();i)couts[i];迭代器string::iterator its.begin();while(it!s.end()){cout*it;it;}范围 forC11 首选for(autoch:s)coutch;4.4 修改与查找开发最常用shello;// 拼接优先用s ;s.append(world);constchar*cstrs.c_str();// 转 C 字符串size_t poss.find(w);// 查找string subs.substr(0,5);// 截取4.5 输入神器getline读取带空格的一整行string line;getline(cin,line);5 string 底层结构面试高频5.1 VS 下SSO 短字符串优化32 位占28 字节长度 16内部栈数组长度 ≥ 16堆空间结构联合体 size capacity 指针5.2 GCC 下COW 写时拷贝只占4 字节一个指针堆内存存长度 容量 引用计数读共享、写复制高效省内存6 面试必问浅拷贝 vs 深拷贝6.1 浅拷贝坑默认拷贝构造只拷贝指针。多个对象共用同一块内存。析构时重复释放→ 程序崩溃。6.2 深拷贝解决方案每个对象独立开辟空间。资源不共享安全不冲突。6.3 现代写法最优String(constStrings):_str(nullptr){Stringtmp(s._str);swap(_str,tmp._str);}Stringoperator(String s){swap(_str,s._str);return*this;}6.4 写时拷贝 COW浅拷贝 引用计数。读共享写才真正开空间。拖延症式高效优化。7 string 模拟实现面试可直接手写classString{public:String(constchar*str){if(strnullptr)str;_strnewchar[strlen(str)1];strcpy(_str,str);}// 深拷贝现代写法String(constStrings):_str(nullptr){Stringtmp(s._str);swap(_str,tmp._str);}Stringoperator(String s){swap(_str,s._str);return*this;}~String(){delete[]_str;_strnullptr;}constchar*c_str()const{return_str;}size_tsize()const{returnstrlen(_str);}charoperator[](sslocal://flow/file_open?urlsize_tiflow_extraeyJsaW5rX3R5cGUiOiJjb2RlX2ludGVycHJldGVyIn0) { return _str[i]; }private:char*_str;};8 OJ 实战string 高频题带答案8.1 仅仅反转字母stringreverseOnlyLetters(string s){intl0,rs.size()-1;while(lr){if(!isalpha(s[l]))l;elseif(!isalpha(s[r]))r--;elseswap(s[l],s[r--]);}returns;}8.2 第一个只出现一次的字符intfirstUniqChar(string s){intcnt[256]{0};for(autoch:s)cnt[ch];for(inti0;is.size();i)if(cnt[s[i]]1)returni;return-1;}8.3 字符串相加大数加法stringaddStrings(string num1,string num2){intinum1.size()-1,jnum2.size()-1;string res;intcarry0;while(i0||j0||carry){intsumcarry;if(i0)sumnum1[i--]-0;if(j0)sumnum2[j--]-0;carrysum/10;res(sum%10)0;}reverse(res.begin(),res.end());returnres;}9 string 核心要点总结背会直接面试string 是管理字符数组的类彻底替代 C 风格字符串。优先用、size()、reserve、c_str()。遍历三法[]、迭代器、范围 for。resize 改长度reserve 改容量。底层VS 用 SSOGCC 用 COW。面试核心浅拷贝/深拷贝、模拟实现、扩容机制。OJ 高频反转、去重、字符串加法、回文判断。10 结尾 引流本文由 C 后端学习笔记整理后续将持续更新vector 底层原理与模拟实现list、map、unordered_map 深度剖析STL 面试 100 题计算机基础、操作系统、网络觉得有用请 点赞 收藏 关注第一时间收到硬核干货更新