11.string中运算符的使用
1、operator=
string类中对=运算符进行了重载,重载后的=运算符支持string类的赋值、字符串的赋值以及字符的赋值。
#include <iostream> #include <string> using namespace std; int main() { string s1; string s2("CSDN"); //支持string类的赋值 s1 = s2; cout << s1 << endl; //CSDN //支持字符串的赋值 s1 = "hello"; cout << s1 << endl; //hello //支持字符的赋值 s1 = 'x'; cout << s1 << endl; //x return 0; }
2、operator+=
string类中对+=运算符进行了重载,重载后的+=运算符支持string类的复合赋值、字符串的复合赋值以及字符复合的赋值。
#include <iostream> #include <string> using namespace std; int main() { string s1; string s2("hello"); //支持string类的复合赋值 s1 += s2; cout << s1 << endl; //hello //支持字符串的复合赋值 s1 += " CSDN"; cout << s1 << endl; //hello CSDN //支持字符的复合赋值 s1 += '!'; cout << s1 << endl; //hello CSDN! return 0; }
其实,operator+=的底层就是调用的push_back和append
3、operator+
string类中对+运算符进行了重载,重载后的+运算符支持以下几种类型的操作:
string类 + string类
string类 + 字符串
字符串 + string类
string类 + 字符
字符 + string类
它们相加后均返回一个string类对象。
#include <iostream> #include <string> using namespace std; int main() { string s; string s1("super"); string s2("man"); char str[] = "woman"; char ch = '!'; //string类 + string类 s = s1 + s2; cout << s << endl; //superman //string类 + 字符串 s = s1 + str; cout << s << endl; //superwoman //字符串 + string类 s = str + s1; cout << s << endl; //womansuper //string类 + 字符 s = s1 + ch; cout << s << endl; //super! //字符 + string类 s = ch + s1; cout << s << endl; //!super return 0; }
4、operator>> 和 operator<<
string类中也对>>和<<运算符进行了重载,这就是为什么我们可以直接使用>>和<<对string类进行输入和输出的原因。
istream& operator>> (istream& is, string& str);
ostream& operator<< (ostream& os, const string& str);
#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; //输入 cout << s << endl; //输出 return 0; }
5、!=、<、<=、>等
string类中还对一系列关系运算符进行了重载,它们分别是==、!=、<、<=、>、>=。重载后的关系运算符支持string类和string类之间的关系比较、string类和字符串之间的关系比较、字符串和string类之间的关系比较。
#include <iostream> #include <string> using namespace std; int main() { string s1("abcd"); string s2("abde"); cout << (s1 > s2) << endl; //0 cout << (s1 < s2) << endl; //1 cout << (s1 == s2) << endl; //0 return 0; }
注意
:这些重载的关系比较运算符所比较的都是对应字符的ASCII码值。
12.string中与迭代器相关的函数
1、与正向迭代器相关的函数
begin函数:返回一个指向字符串第一个字符的迭代器。
函数原型:
iterator begin();
const_iterator begin() const;
end函数:返回一个指向字符串结束字符的迭代器,即’\0’。
函数原型:
iterator end();
const_iterator end() const;
使用示例:
#include <iostream> #include <string> using namespace std; int main() { string s("hello"); //正向迭代器 string::iterator it = s.begin(); while (it != s.end()) { cout << *it; it++; } cout << endl; //hello return 0; }
2、与反向迭代器相关的函数
rbegin函数:返回指向字符串最后一个字符的反向迭代器。
函数原型:
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
rend函数:返回指向字符串第一个字符前面的理论元素的反向迭代器。
函数原型:
reverse_iterator rend();
const_reverse_iterator rend() const;
使用示例:
#include <iostream> #include <string> using namespace std; int main() { string s("hello"); //反向迭代器 string::reverse_iterator rit = s.rbegin(); while (rit != s.rend()) { cout << *rit; rit++; } cout << endl; //olleh return 0; }
13.string与字符串之间的转换
1、将字符串转换为string
将字符串转换为string很简单,在前面讲string的定义方式时就有说到。
#include <iostream> #include <string> using namespace std; int main() { //方式一 string s1("hello world"); //方式二 char str[] = "hello world"; string s2(str); cout << s1 << endl; //hello world cout << s2 << endl; //hello world return 0; }
2、使用c_str或data将string转换为字符串
const char* c_str() const;
const char* data() const;
区别:
在C++98中,c_str()返回 const char* 类型,返回的字符串会以空字符结尾。
在C++98中,data()返回 const char* 类型,返回的字符串不以空字符结尾。
但是在C++11版本中,c_str()与data()用法相同。
#include <iostream> #include <string> using namespace std; int main() { string s("hello world "); const char* str1 = s.data(); const char* str2 = s.c_str(); cout << str1 << endl; cout << str2 << endl; return 0; }
兼容C语言,相互配合:C语言与C++中字符串读取结束的区别:
14.string中子字符串的提取
1、使用substr函数提取string中的子字符串
string substr (size_t pos = 0, size_t len = npos) const;
#include <iostream> #include <string> using namespace std; int main() { string ur1 = "https://cplusplus.com/reference/string/string/"; size_t pos1 = ur1.find("://"); string protocol;//协议 if (pos1 != string::npos)//找到了 { protocol = ur1.substr(0, pos1);//substr(pos, n)提取pos位置开始的n个字符序列作为返回值 } cout << protocol << endl; string domain;//域名 string uri;//资源名 size_t pos2 = ur1.find("/", pos1 + 3); if (pos1 != string::npos)//找到了 { domain = ur1.substr(pos1 + 3, pos2 - (pos1 + 3)); uri = ur1.substr(pos2 + 1); } cout << domain << endl; cout << uri << endl; return 0; }
2、使用copy函数将string的子字符串复制到字符数组中
size_t copy (char* s, size_t len, size_t pos = 0) const;
#include <iostream> #include <string> using namespace std; int main() { string s("abcdef"); char str[20]; //copy(str, n, pos)复制pos位置开始的n个字符到str字符串 size_t length = s.copy(str, 4, 2); //copy函数不会在复制内容的末尾附加'\0',需要手动加 str[length] = '\0'; cout << str << endl; //dcef return 0; }
15.string中的getline函数
在使用>>进行输入操作时,当>>读取到空格便会停止读取,基于此,我们将不能用>>将一串含有空格的字符串读入到string对象中。
#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; //输入:hello CSDN cout << s << endl; //输出:hello return 0; }
这时,我们就需要用getline函数完成一串含有空格的字符串的读取操作了。
用法一:
istream& getline (istream& is, string& str);
getline函数将从is中提取到的字符存储到str中,直到读取到换行符’\n’为止。
#include <iostream> #include <string> using namespace std; int main() { string s; getline(cin, s); //输入:hello CSDN cout << s << endl; //输出:hello CSDN return 0; }
用法二:
istream& getline (istream& is, string& str, char delim);
getline函数将从is中提取到的字符存储到str中,直到读取到分隔符delim或换行符’\n’为止。
#include <iostream> #include <string> using namespace std; int main() { string s; getline(cin, s, 'D'); //输入:hello CSDN cout << s << endl; //输出:hello CS return 0; }
16.总结:
今天我们认识并具体学习了STL中string类,开启了STL学习的大门。接下来,我们将进行STL中string类的模拟实现。希望我的文章和讲解能对大家的学习提供一些帮助。
当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~