在学习string类之前,先在这里推荐2个好用的网站,可以用来查阅C++的相关知识
https://en.cppreference.com/w/
上面的是非官方的,下面的官方的,但是个人感觉还是上面的好用。
一.string 类是什么
简单来说,string 是C++中用来管理字符串的类。
他有很多接口,大致分为:
1.string类对象的构造
2.string类对象的访问及遍历操作
3.string类对象的容量操作
4. string类对象的修改操作
5.string类非成员函数
下面开始介绍。
二.string类对象的构造
可以看到,库里一共有7种构造方式,但我们常用的是(1),(2),(4),其它并不怎么用,如果想要了解的话,可以自行查看文档。
1. int main() 2. { 3. string s1; //不初始化(1) 4. string s2("hello world"); //常量字符串初始化 (2) 5. string s3(s2); //string 类型初始化 (4) 6. 7. return 0; 8. }
三.string类对象的访问及遍历操作
库里重载了 [] 运算符,这就允许我们可以像C语言中一样,用 [] 加下标的方式访问string类对象。
string类的遍历有很多种方法:
1.像C语言中数组的遍历方式
1. string s("hello world"); 2. for (int i = 0; i < s.size(); i++) 3. { 4. cout << s[i] << endl; 5. }
2.范围for
1. for (auto ch : s) 2. { 3. cout << ch<< endl; 4. }
注意范围for只能正向遍历;
3.迭代器 iterator
1. std::string::iterator it = s.begin(); 2. while (it != s.end()) 3. { 4. cout << *it << endl; 5. it++; 6. }
迭代器是封装在string类里面的,所以要以上述方式使用。
迭代器是像指针一样的类型,但并不完全是指针,它提供了一种统一的方式修改和访问容器的数据,不像前两种方式需要是数组,且范围for是用迭代器实现的。
迭代器有很多接口:
rbegin和rend是反向迭代器的接口,后面的4个并不常用,就不做过多介绍了 。
四.string类对象的容量操作
size和lengh的功能差不多,但还是推荐用size;
resize可以设置size,如果你设置的比你实际的有效数据小,则多的会被舍弃:
reserve可以设置capacity,但他实际设置的空间,比你预想的要大:
如果想要用reserve实现缩容的操作,则需要先清空有效数据,否则无效:
五.string类对象的修改操作
库里提供很多修改string类对象的接口,但我们最常用,用的最爽的还是 += ,这个清楚明了,你不用担心它的容量问题,它会自动扩容的
它支持string类对象,常量字符串,字符。
下面再介绍几个常用的:
find与rfind
find可以在一个字符串中从pos处开始寻找字符或是字符串,并返回第一个与之匹配的下标 ,如果没有找到,则返回npos,npos的值其实是-1;
rfind顾名思义,就是反向查找,功能和find还是一样的。
substr
截取从 pos 到 len 的子串
例:分离一个网址的协议,域名和资源
1. int main() 2. { 3. string ur = "https://tsunagarujp.bunka.go.jp/level02/b13"; 4. 5. size_t pos1= ur.find("://"); 6. string protocol; //协议 7. string domain; //域名 8. string uri; //资源 9. 10. protocol = ur.substr(0, pos1); 11. cout << protocol << endl; 12. size_t pos2 = ur.find("/",pos1+3); 13. domain = ur.substr(pos1 + 3, pos2 - pos1 - 3); 14. cout << domain << endl; 15. uri = ur.substr(pos2 + 1); 16. cout << uri << endl; 17. 18. return 0; 19. 20. 21. }
c_str
返回string类中字符串的地址,因为string类既包括了字符串,也包括了size,capacity这些变量,有时为了更好的配合C语言,会使用这个函数。
请看例题:
1. //以下代码的运行结果是什么? 2. int main() 3. { 4. 5. string a="hello world"; 6. string b=a; 7. if (a.c_str()==b.c_str()) 8. cout<<"true"<<endl; 9. else 10. cout<<"false"<<endl; 11. 12. string c=b; 13. c=""; 14. if (a.c_str()==b.c_str()) 15. cout<<"true"<<endl; 16. else 17. cout<<"false"<<endl; 18. 19. a=""; 20. if (a.c_str()==b.c_str()) 21. cout<<"true"<<endl; 22. else 23. cout<<"false"<<endl; 24. 25. return 0; 26. 27. } 28.
答案:false false false
getline
获取一行字符串(包括空格)
这个就弥补了cin>> 的不足,cin>> 是遇到空格就停止读取了。
🐬🤖本篇文章到此就结束了, 若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻
😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩
😍😁谢谢你的阅读。😸😼