string类(三)
- 非成员重载函数
- relational operaters 关系运算符
- operator+
- operator<< operator>>
- getline
- <string>头文件内的函数
- string转化为数字类型
- 其他数值类型转化为string
- 练习:字符串最后一个单词的长度
非成员重载函数
relational operaters 关系运算符
不重载为成员函数是为了让左操作数不受类的对象的类型限制
即左操作数是非当前重载类的类型只有重载为全局函数才能实现
以==为例
string s1("aaa"),s2("bbb");
const char* str="xxxxx";
三个重载是为了同时支持
s1==str;
str==s1;
s1==s2;
实际上只有第一个重载也支持这三种比较,因为单参数构造编译器支持隐式类型转化
operator+
void stringtest12() {string s1("aaa"), s2("bbb");cout << s1 << endl;cout << s2 << endl;const char* str = "xxxxx";cout << str << endl;string s3, s4;s3 = s1 + s2;cout << s3 << endl;s4 = s1 + str;cout << s4 << endl;
}
operator<< operator>>
注意:在cin>>中,空格和换行默认是是多项输入值之间的分隔——以空格和换行作为输入结束的标志
会导致的问题:无法一次性读取含空格的字符串
void stringtest13() {string s1, s2;cin >> s1 >> s2;cout << s1 << endl;cout << s2 << endl;
}
解决方案如下:
getline
可以自定义结束输入的标志字符(delim)
cin是istream类型的对象,所以一般作为getline的第一个参数
如果要读取空格或换行进入string,使用getline
void stringtest14() {string s1, s2;//以换行符作为结束标志,能读取空格getline(cin, s1);cout << "s1=" << s1 << endl;//以'#'作为结束标志,能读取换行符存储为'\n'getline(cin, s2, '#');cout <<"s2="<< s2 << endl;
}
头文件内的函数
string转化为数字类型
i int
u unsigned
l long
f flout
d double
分析参数:
str:string类型对象
idx:一个size_t类型指针,默认为NULL(idx=0)
idx 参数的主要作用是帮助了解字符串中哪些部分被成功转换为整数,哪些部分没有被转换。如果转换过程中遇到无法解析为整数的字符,idx会指向第一个无法解析的字符的位置。
base:转换后数字的进制,默认为十进制(base=10)
void stringtest15() {string s1("2025");int n1=stoi(s1);cout << n1<<endl;//转化为8进制形式int n2=stoi(s1,nullptr,8);cout << n2 << endl;string s2("2025y23");//传这种无法完全转换的字符串给stoi也不会报错size_t idx = 0;//定义一个idx可以在stoi中记录到第一个出现无法转换为整型的字符的位置// 如果不需要记录就传nullptr即可int n3 = stoi(s1, &idx, 10);cout << n3 << endl;cout << s2.substr(idx) << endl;//发现输出了无法转换的y之后的内容,证实了之前说明的idx的功能
}
其他数值类型转化为string
(数值类型有什么参照上一点string可以转化成什么数值类型)
注意的点:由于浮点型可能无法精确存储,所以有时会出现一点偏差
浮点值二进制表示的不精确性:
- 浮点数在计算机中以二进制形式存储,而某些十进制小数无法精确表示为二进制小数。因此,即使原始值是 0.1,在计算机中存储时可能已经变成了一个非常接近但不完全等于 0.1 的值。
- 默认精度:std::to_string 在转换浮点数时会使用默认的精度(通常是 6 位小数),但这可能不足以精确表示某些浮点数的值。
代码示例
void stringtest16() {int n = 2025;double num = 0.025;string s1 = to_string(n);string s2 = to_string(3.1415926);cout << s1 << endl;cout << s2 << endl;
}
练习:字符串最后一个单词的长度
https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224&rp=5&ru=/activity/oj&qru=/ta/huawei/question-ranking
关键点:使用getline读取含空格的字符串
其他类似于之前的提取后缀
#include<iostream>
#include<string>
using namespace std;
int main()
{string line;// 不要使用cin>>line,因为会它遇到空格就结束了// while(cin>>line)while(getline(cin, line)){size_t pos = line.rfind(' ');//最后一个反着找cout<<line.size()-pos-1<<endl;}return 0;
}