5月23日每日学习string如果你想了解string的手搓实现可以点击这里文章目录5月23日每日学习string学习STL 的3个境界string1. 是什么2.头文件string3.构造函数**constructor**4.重载operator[ ]2个题目5.遍历重载operator[ ]迭代器范围for6.迭代器正向反向倒着遍历建议用‼️注意点7.auto‼️注意点8.capacity()5月26日每日学习9.vs 中的 sizeofstringx64环境x86环境10.resize、clear 和 reservereserve修改capacityclearresize增加有效长度size和length11.3个题目12.push_back、append和13.insert、erase和replace14.几种find‼️返回值15.operator16.getlinegetline其他的3种方法学习STL 的3个境界能用明理能扩展工作一两年才能达到string1. 是什么严格来说string不属于STL而是属于C标准库因为出现的比较早。string是一个管理字符串的类2.头文件string3.构造函数constructor默认无参string s1;默认是空字符串带参构造string s2(“38ffjdfj”);拷贝构造string s3(s2);string (const string str, size_t pos, size_t len npos);拷贝从下标为pos的地方向后的len个字符如果len后面的所有数就是直到结束如果不传最后一个参数就是npos-1就是size_t的最大值 直到最后string (const char* s, size_t n);拷贝前n个字符string (size_t n, char c);n个字符c来生成stringtemplate class InputIterator string (InputIterator first, InputIterator last);暂且不说4.重载operator[ ]➡️运算符重载的知识在这里⬅️作用能直接通过下标访问string中的字符返回值对应字符的引用两个函数​char operator[] (size_t pos);const char operator[] (size_t pos) const;2个题目917. 仅仅反转字母classSolution{public:stringreverseOnlyLetters(string s){intleft0,rights.size()-1;while(leftright){while(leftright(!isalpha(s[left]))){left;}while(leftright(!isalpha(s[right]))){right--;}swap(s[left],s[right--]);}returns;}};大数运算415. 字符串相加classSolution{public:stringaddStrings(string num1,string num2){intp1num1.size()-1;intp2num2.size()-1;string ret;intsum;intthisnum;intnext0;while(p10||p20){intn1(p10?num1[p1]-0:0);intn2(p20?num2[p2]-0:0);sumn1n2next;thisnumsum%10,nextsum/10;retthisnum0;p1--;p2--;}if(next)ret1;reverse(ret.begin(),ret.end());returnret;}};5.遍历重载operator[ ]迭代器范围for6.迭代器迭代器也有4种类型迭代器类型获取方式是否可修改iteratorbegin()/end()✅reverse_iteratorrbegin()/rend()✅const_iteratorcbegin()/cend()或 const 对象调用begin()❌const_reverse_iteratorcrbegin()/crend()或 const 对象调用rbegin()❌​iterator begin();类型是iteratorconst_iterator begin() const;‼️类型是const_iteratorconst版本只能读不能改正向begin首元素end尾元素的下一个元素string::iterator its.begin();while(it!s.end()){cout*it ;it;}反向倒着遍历建议用rbegin最后一个位置rend第一个字符的前一个位置string::reverse_iterator its.rbegin();while(it!s.rend()){cout*it ;it;}‼️注意点反向迭代器的类型不是iterator而是reverse_iterator建议用auto从rbegin到rend还是而不是–7.autoC11才有是一种自动的变量类型底层是迭代器‼️注意点不能直接定义变量一行定义多个变量变量必须为同类❌auto a1 3, a2 4.4;不能定义数组不能做函数参数和模板不一样可以做返回值auto➕引用 可以增加性能8.capacity()不算末尾的‘\0’扩容vs中初始空间是16第一次扩容是2倍扩后面是1.5倍Linux/gvs中的string在创建时有个Buf容量是16字符capacity是155月26日每日学习9.vs 中的 sizeofstring不同平台实现不一x64环境x86环境classstring{private:char_buff[16];// 16字节固定不变char*_str;// 指针size_t _size;// 长度size_t _capacity;// 容量};两个前提32 位x86模式所有指针、size_t类型都是4 字节64 位x64模式所有指针、size_t类型都是8 字节10.resize、clear 和 reservereserve修改capacity提前开空间避免扩容capacity 不包含‘\0’reserve想要100空间至少要开101——适应‘\0’不修改有效内容和长度size和length缩容不确定至少vs不缩可能开的空间更大clear删除有效 长度size和length不删capacityresize增加有效长度size和length插入的都是‘\0’11.3个题目917. 仅仅反转字母classSolution{public:stringreverseOnlyLetters(string s){intleft0,rights.size()-1;while(leftright){while(leftright(!isalpha(s[left]))){left;}while(leftright(!isalpha(s[right]))){right--;}swap(s[left],s[right--]);}returns;}};387. 字符串中的第一个唯一字符classSolution{public:intfirstUniqChar(string s){intarr[26]{0};for(autoe:s){arr[e-a];}intcnt0;for(autoe:s){if(arr[e-a]1)returncnt;cnt;}return-1;}};大数运算415. 字符串相加classSolution{public:stringaddStrings(string num1,string num2){intp1num1.size()-1;intp2num2.size()-1;string ret;intsum;intthisnum;intnext0;while(p10||p20){intn1(p10?num1[p1]-0:0);intn2(p20?num2[p2]-0:0);sumn1n2next;thisnumsum%10,nextsum/10;retthisnum0;p1--;p2--;}if(next)ret1;reverse(ret.begin(),ret.end());returnret;}};12.push_back、append和push_back只能尾插单个char字符append插入string字符串strings(abcdef);stringr(012345);s.append(r);coutsendl;//abcdef012345插入string字符串中从x开始的y个字符strings(abcdef);stringr(012345);s.append(r,2,3);coutsendl;//abcdef234插入char字符串strings(abcdef);s.append(hijk);coutsendl;//abcdefhijk插入char字符串的前n个strings(abcdef);s.append(hijk,2);coutsendl;//abcdefhi等等尾插更方便13.insert、erase和replace头插单个char字符的两种方式insert (iterator p, char c);s.insert(s.begin(),h);insert (size_t pos, size_t n, char c);s.insert(0,1,h);erase尾删erase (iterator p);s.erase(s.end()-1);14.几种find最后一个单词的长度需要用到getline函数作用string::find正向查找子串或字符返回下标未找到返回nposstring::rfind反向查找string::find_first_of查找字符串中任意字符第一次出现的位置string::find_first_not_of查找第一个不属于给定字符集的位置string::npos静态常量表示“未找到”‼️返回值找到了返回下标没找到返回:string::npos建议写成if (pos ! string::npos)15.operator运算符重载的定义和用法为什么不是类内运算符重载-为了能让字符串string也能成立类内重载的话第一个参数是this指针大数运算415. 字符串相加classSolution{public:stringaddStrings(string num1,string num2){intp1num1.size()-1;intp2num2.size()-1;string ret;intsum;intthisnum;intnext0;while(p10||p20){intn1(p10?num1[p1]-0:0);intn2(p20?num2[p2]-0:0);sumn1n2next;thisnumsum%10,nextsum/10;retthisnum0;p1--;p2--;}if(next)ret1;reverse(ret.begin(),ret.end());returnret;}};16.getline题目最后一个单词的长度需要用到getlinegetline基础用法getline(cin, s);→ 读到换行符\n就停止能完整读取带空格的一整行自定义结束符getline(cin, s, a);→ 读到字符 ‘a’ 就停止没有 ‘a’ 就一直读直到换行。其他的3种方法方法语法特点fgetsfgets(arr, sizeof(arr), stdin);头文件 cstdio保留 \n自动加 \0安全升级版 scanfscanf(%[^\n]s, arr);读至回车自动加 \0不能读空格开头getcharwhile ((chgetchar())!\n) {arr[i]ch;}边读边处理灵活需手动初始化数组为 0如果你想了解string的手搓实现可以点击这里