「string」笔记
参考:比特鹏哥
1. string
string是一种类型,指的是字符串,比字符数组更高级
头文件 <string>
#include <string>int main()
{string a;//未初始化string b = "good good";//初始化string c("good sfternoon");//初始化return 0;
}
可以直接把b中的字符串赋给c
eg. b = c;
①没有‘\0’作为结束标志
②每个元素都有下标,与字符数组类似,都从零开始
2. 输入
①cin
不能输入带有空格的字符串
②getline
头文件<string>
两种形式,能输入带有空格的字符串
#include <string>int main()
{
①getline(cin,字符串名字);
②getline(cin,字符串名字,截至符号);
return 0;
}
①cin:从键盘输入;字符串名字:输入的数据放入到的字符串;到‘\n’停止(不包含‘\n’)
②cin:从键盘输入;字符串名字:输入的数据放入到的字符串;截至符号:可以自定义停止符号(到其停止,不包含‘它’)
3. 计算string类型字符串长度 size()
#include <iostream>
#include <string>
using namespace std; int main()
{string b = "dddd sss";cout << b.size() << endl;return 0;
}
格式名:数组名.size()
4. 迭代器(iterator)
类似于指针,是一种对象。访问迭代器指向的值,需要解引用(*)
头文件 <string>
begin()与end()
string中的begin()与end()返回迭代器的类型:string :: iterator(用于作为其变量名的类型)
①begin():返回第一个字符所处的位置
②end(): 返回最后一个字符的下一个位置(此位置不属于字符串)
#include <iostream>
#include <string>
using namespace std;int main()
{string str = "holle world!";//迭代器的使用string::iterator it = str.begin();string::iterator it1 = str.end();cout << *it << endl;//解引用操作cout << *(--it1) << endl; return 0;
}
这两个迭代器可以加或减某个数,也可相减,所以也可以用这两个迭代器逐个输出字符串
注意,相减只能分别定义再相减,定义一个变量一起减会报错:
//正确string::iterator it1 = str.end();string::iterator it2 = str.begin();cout << it1-it2 << endl; //错误string::iterator it = str.end() - str.begin();string::iterator迭代器中没有str.end() - str.begin()这种类型
5. push_back() 末尾添加一个
用于在字符串末尾添加一个字符
头文件 <string>
#include <iostream>
#include <string>
using namespace std;int main()
{string s;s.push_back('a');return 0;
}
6. pop_back() 末尾删去一个
删除字符串最后一个字符。如果是空字符还要删去,则会出错。
#include <iostream>
#include <string>
using namespace std;int main()
{//一个一个删去 string s = "hello word!";s.pop_back();cout << s << endl;s.pop_back();cout << s << endl;//循环删去 string s = "hello word!";for(int i = s.size();i>=0;i++){s.pop_back();cout << s << endl;}return 0;
}
7. insert() 中间插入字符或字符串
在字符串中间某位置前插入字符或字符串
头文件 <string>
①变量名.insert(插入位置的下一个位置,插入的字符串);
②变量名.insert(插入位置的下一个位置,插入字符的数量,插入的字符);
8. +或+=操作
本质:string重载了operator操作符
9. find() 查询字符/字符串位置
头文件 <string>
寻找某一字符或字符串在另一字符串中位置,从所设定的初始位置开始(默认为零,从第一位开始寻找)。找到,返回该字符或字符串第一次出现的起始下标位置;未找到,返回npos(-1)
size_t 变量名 接收find()的返回值
①string类型变量名.find("字符串"/'字符'/另一个string类型变量名,(可不写,默认从零开始)开始查询位置);
#include <iostream>
#include <string>
using namespace std;int main()
{string s("good morning evergone! evergone? everyone!");//字符size_t n = s.find('o');cout << "查找o:" << n << endl;n = s.find('o',8);cout << "查找o第8位之后:" << n << endl;//字符串// 1 "dfe2wef"size_t n1 = s.find("on");cout << "查找on:" << n1 << endl;n1 = s.find("on",21);cout << "查找on第21位之后:" << n1 << endl;// 2 string strstring str = "rgo";size_t n2 = s.find(str);cout << "查找rgo:" << n2 << endl;n2 = s.find(str,20);cout << "查找rgo第20位之后:" << n2 << endl;return 0;
}
②string类型变量名.find("字符串",开始查询位置,要查询字符的长度);
验证是否找到:
10. substr() 截取字符
头文件 <string>
截取字符串中指定位置指定长度的子串
string类型变量名.sbustr(pos,len);
//pos:默认为0,从第0位开始截取,可设定截取位置
//len:默认npos,一直截取字符串直到末尾,可设定截取长度
#include <iostream>
#include <string>
using namespace std;int main()
{string s = "qwerty uijkolpd sunhsdns.";string t;cout << "初始t:" << endl; //①s.substr()t = s.substr();cout << "不加参数:" << t << endl;//②s.substr(pos)t = s.substr(4);cout << "pos:" << t << endl;//③s.substr(pos,len)t = s.substr(4,6);cout << "pos,len:" << t << endl; return 0;}
11. 关系运算
'==','!=','>','<','>=','<='也同样适用于string类型的字符串进行比较,或者比较string类型和C语言风格字符串,但比较的两者中至少要有一个string类型的字符串
比较的不是字符串的长度,而是相对位置字符的ascall码值
#include <iostream>
#include <string>
using namespace std;int main()
{string s;string t;//输入 getline(cin,s);getline(cin,t);//比较 if(s>t) cout << "s>t" << endl;else if(s == t) cout << "s==t" << endl;else cout << "s<t" << endl; return 0;
}
12. string类型字符串与数值的转换
①字符串转数值
数值均转成十进制
stoi()/stol() stod()/stof()
头文件 <string>
1.1 实际上是把数值字符转换成数值,从第一个字符开始,遇到不符合要求的字符为止
1.2 stoi() 把字符串转换成int类型
s--string to--转换成 i--int类型;
以此类推,另外三个,l--ling long int类型; d--double类型; f--float类型;
1.3 格式
eg. stoi(string类型变量名,㈠接收不符合要求的字符的位置的变量的地址,㈡字符串中数值进制格式);
㈠接收不符合要求的字符的位置的变量的地址
⑴ 要用 size_t 变量名 来接收不符合要求的字符的位置
这个东西实际上就是告诉我们,这串字符到第几位无法转换成数值了
⑵ 也可以不设置,直接写成NULL或0
#include <iostream>
#include <string>
using namespace std;int main()
{string s = "01011aa9;9";size_t pow;int t = stoi(s,&pow);//默认值为十进制 cout << "t: " << t << endl;cout << "(一)pow:" << pow << endl; return 0;
}
㈡字符串中数值进制格式
⑴ 不写,默认为字符串中字符为十进制形式
⑵ 若为2,则认为字符串中字符二进制形式,并且会被转成十进制形式输出,8,16也是如此
⑶ 若为0,则程序会猜测字符串中字符的进制形式,比如,若为0开头,会被认为是八进制;若 为0x开头,则会被认为是十六进制
②数值转字符串
to_string()就是把数值转换成string类型字符串
整型,浮点型都是可以使用
头文件 <string>
另:
1. isspace() 判断一个字符是否为空白字符
头文件 <cctype>
空白字符:空格和换行符
//统计除空白字符外的字符串个数
#include <iostream>
#include <string>
#include <cctype>
using namespace std;int main()
{string s;//输入 getline(cin,s);//统计 int t=0;for(auto e : s){if(isspace(e))//遍历s中是否有字符为空白字符 continue;else t++;//统计除空白字符外的字符串个数} //输出 cout << t << endl;return 0;
}
2. reverse 字符串的逆序
void reverse(要反转字符串的第一个元素地址(迭代器),要反转字符串的最后一个元素地址(迭代器));
头文件 <algorithm>