目录
assagin|erase|insert
assign相当于赋值语句
insert插入,可插入某个string对象,字符串,字符,在某位置前插入
若想在空格处插入%20,下面这种写法会出问题
当遇到空格之后,insert会把%20插入到空格前面,然后把其余字符串往后挪,
而插入之后,i还在原来位置,往后遍历又会遇到空格,所以程序会陷入死循环
修改每次i插入后的位置,程序正常运行
若想吧空格替换为%20
erase是用来删除的
string& erase(size_t pos=0,size_t lend=npos)
从0这个位置开始删除len个字符
如果len>剩余字符串长度,则有多少删除多少,删到结尾
用insert和erase效率太低,我们采用空间换时间的方法来优化
时间复杂度比之前低一点,但是空间复杂度变高
刚才的写法,还可用replace替代,replace是用来替换的,但是效率不高,也要挪动数据,
insert,erase,replace不推荐使用,效率低
c_str()
c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同。
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
返回const char * 类型
用C语言的方式打开文件,此时报错
加上c_str即可正常运行
读取当前文件
比较这俩种写法
效果一样 ,但是实际不一样,底层原理不一样
C++中是以string对象size为准,size为多少就输出多少个
而C语言是以常量字符串遇到\0结束
find
find可查找一个字符,字符串,string对象,pos指从某个位置开始查,n代表要匹配的字符序列的长度。
返回值是无符号类型,如果找到了返回找到的第一个字符的位置,如果没找到返回string::npos,npos是一个特别大的数字
有时还会用到substr
取当前string的字符串返回一个新对象,从pos位置,取len个字符,规则跟前面取字符一样
用find和substr查找文件的后缀名
有的文件后缀比较复杂:如.exe.zip
当我们想取最后一个后缀的时候,可用rfind
搜索由其参数指定的序列的最后一次出现。
把find替换为rfind之后,直接找到最后一个.
用find和substr实现网址的分离
void test_string5() { string ur1 = "https://cplusplus.com/reference/string/string/rfind/"; size_t pos = ur1.find("://"); string ur2 = ur1.substr(0, pos-1); cout << ur2 << endl; size_t pos1 = ur1.find('/', pos + 3); string ur3 = ur1.substr(pos + 3, pos1 - pos-3); cout << ur3 << endl; string ur4 = ur1.substr(pos1+1); cout << ur4 << endl; } int main() { test_string5(); return 0; }
find_first_of:在字符串中搜索与其参数中指定的任何字符相匹配的第一个字符,指定pos位置时,从pos位置开始搜索,匹配一个字符就够了(不是全部匹配)
operator (了解内容)
string还有+比较大小等功能
getline
不管是cin还是scanf,遇到空格或者换行会进行间会把hello传输给a,空格和c保留在缓冲区
![]()
C++ string中有getline可以解决上面的问题
从 is 中提取字符并将其存储到 str 中,直到找到分隔字符 delim(或换行符“\n”,表示 (2))。
如果到达文件的末尾,或者在输入操作期间发生其他错误,则提取也会停止。
如果找到分隔符,则将其提取并丢弃(即不存储它,下一个输入操作将在它之后开始)。
请注意,调用之前的任何内容都将替换为新提取的序列。字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)
#include <iostream> #include <string> using namespace std; int main(){ string str; getline(cin,str); size_t pos=str.rfind(' '); if(pos!=string::npos) { cout<<str.size()-1-pos<<endl; } else { cout<<str.size()<<endl; } }
convert
C++中convert使用率比较高
atoi可把字符串转整形
itoa整形转字符串
to_string将数字常量转换为字符串,返回值为转换完毕的字符串,返回类型为string
也能转回去
习题 字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符 - 力扣(LeetCode)
class Solution { public: int firstUniqChar(string s) { int arr[26]={0}; for(auto ch:s) { arr[ch-'a']++; } for(int i=0;i<s.size();i++) { if(arr[s[i]-'a']==1) return i; } return -1; } };
思路:创建一个容量为26的整形数组,数组第一个元素到第一个元素分别用来统计a到z出现的次数,
习题 验证一个字符串是否回文
class Solution { public: bool IslettersorNumb(char str) { if((str>='0'&&str<='9')||(str>='a'&&str<='z')) return true; else return false; } bool isPalindrome(string s) { for(auto& ch:s) { if(ch>='A'&&ch<='Z') ch+=32; } int begin=0,end=s.size()-1; while(begin<end) { while(begin<end&&!IslettersorNumb(s[begin])) begin++; while(begin<end&&!IslettersorNumb(s[end])) end--; if(s[begin]!=s[end]) return false; else begin++; end--; } return true; } };