string笔记
「string」笔记
参考:比特鹏哥
1. 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
头文件
两种形式,能输入带有空格的字符串
#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)
类似于指针,是一种对象。访问迭代器指向的值,需要解引用(*)
头文件
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() 末尾添加一个
用于在字符串末尾添加一个字符
头文件
#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() 中间插入字符或字符串
在字符串中间某位置前插入字符或字符串
头文件
①变量名.insert(插入位置的下一个位置,插入的字符串);
②变量名.insert(插入位置的下一个位置,插入字符的数量,插入的字符);
8. +或+=操作
本质:string重载了operator操作符
9. find() 查询字符/字符串位置
头文件
寻找某一字符或字符串在另一字符串中位置,从所设定的初始位置开始(默认为零,从第一位开始寻找)。找到,返回该字符或字符串第一次出现的起始下标位置;未找到,返回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 str
string 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类型变量名.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()
头文件
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类型字符串
整型,浮点型都是可以使用
头文件
另:
1. isspace() 判断一个字符是否为空白字符
头文件
空白字符:空格和换行符
//统计除空白字符外的字符串个数
#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(要反转字符串的第一个元素地址(迭代器),要反转字符串的最后一个元素地址(迭代器));
头文件