一、string基本概念
1.1本质
string是C++风格的字符串,而string本质上是一个类。
1.2string和char*的区别
char*是一个指针,string是一个类,类内部封装了char*,管理这个字符串,是一个char*类型的容器。
1.3特点
string类内部封装了很多成员方法,例如:查找find,拷贝copy,删除delete,替换replace,插入insert等。
string管理char*所分配的内存,不用担心赋值越界和取值越界等,由类内部进行负责。
二、基本语法
2.1初始化
string s1; //创建一个空的字符串,无参构造
string str = "hello world";
string s2(str); //有参构造
string s3(s2); //把s2赋给s3,拷贝构造
string s4(10,'a'); //用10个字符a初始化字符串,是一个成员函数
2.2赋值操作
这里把赋值的函数原型和他们所实现的功能列表展示,但实际应用中他们应该用途不大,可以选择不看。后面会列举一些相对常用的函数的代码。
赋值函数原型 | 实现的功能 |
---|---|
string& operator=(const char* s) | char*类型字符串,赋值给当前字符串 |
string& operator=(const string &s) | 把字符串s赋给当前字符串 |
string& operator=(char c) | 把字符赋给当前字符串 |
string& assign(const char *s) | 把字符串s赋给当前字符串 |
string& assign(const char *s,int n) | 把字符串s的前n个字符赋给当前字符串 |
string& assign(const string &s) | 把字符串s赋给当前字符串 |
string& assign(int n,char c) | 用n个字符c赋给当前字符串 |
举例代码:
string str4;
str4.assign("hello world");
string str5;
str5.assign("hello world",5); //把"hello world"的前5个字符赋给str5
string str6;
str6.assign(str5); //和string str6(str5)一个意思
string str7;
str7.assign(5,'x'); //用5个x赋给str7
2.3查找和替换
查找:查找指定字符串是否存在;
替换:在指定的位置替换字符串。
该部分内容还是比较重要的,在很多题目包括实际应用中都能用到。下面列出所有查找和替换的函数原型,并列举部分常用的代码。
函数原型 | 实现的功能 |
---|---|
int find(const string& str,int pos=0) const | 查找字符串str第一次出现位置,从pos开始查找 |
int find(const char* s,int pos=0) const | 查找字符串s第一次出现位置,从pos开始查找 |
int find(const char* s,int pos=0,int n) const | 从pos位置查找字符串s的前n个字符第一次出现位置 |
int find(const char c,int pos=0) const | 查找字符c第一次出现位置 |
int rfind((const string& str,int pos=npos) const | 查找字符串str最后一次出现位置,从pos开始查找 |
int rfind(const char* s,int pos=npos) const | 查找字符串s最后一次出现位置,从pos开始查找 |
int rfind(const char* s,int pos,int n) const | 从pos查找字符串s的前n个字符最后一次出现位置 |
int rfind(const char c,int pos=0) const | 查找字符c最后一次出现位置 |
string& replace(int pos,int n,const string& str) | 替换从pos开始n个字符为字符串str |
string& replace(int pos,int n,const char* s) | 替换从pos开始的n个字符为字符串s |
举例代码:
void text01() {
//find
string str1 = "abcdefgde";
int pos = str1.find("de"); //返回de第一次出现的位置,如果没有de,就返回-1
cout << "pos=" << pos << endl; //pos=3
//rfind
//和find的区别在于rfind从右往左查找,find从左往右查找
pos = str1.rfind("de"); //后面可以再加一个参数pos,表示从pos开始查找,不加默认从最右边开始查找
cout << "pos=" << pos << endl; //pos=7
}
//替换
void text02() {
string str1 = "abcdefg";
str1.replace(1, 3, "1111"); //从下标为1的元素开始,往后的3个元素替换为“1111”
cout << "str1=" << str1 << endl; //str1=a1111efg
}
2.4字符串的比较
字符串的比较函数的返回值是int类型,相等返回 0 ,大于返回 1,小于返回 -1。
函数原型 | 实现的功能 |
---|---|
int compare(const string &s) const | 与字符串s比较 |
int compare(const char *s) const | 与字符串s比较 |
举例代码:
void text03() {
string str1 = "xello";
string str2 = "hello";
if (str1.compare(str2) == 0) {
cout << "str1 = str2" << endl;
}
else if (str1.compare(str2) > 0) {
cout << "str1 > str2" << endl;
}
else {
cout << "str1 < str2" << endl;
}
}
2.5插入和删除
函数原型 | 实现的功能 |
---|---|
string& insert(int pos,const char* s) | 插入字符串 |
string& insert(int pos,const string& str) | 插入字符串 |
string& insert(int pos,int n,char c) | 在指定位置插入n个字符c |
string& erase(int pos,int n = npos) | 删除从pos开始的n个字符 |
举例代码:
//插入和删除
void text04() {
//插入
string str1 = "hello";
str1.insert(1, "222"); //从下标为1的元素开始插入111
cout << str1 << endl; //h222ello
//删除
str1.erase(1, 3); //从下标为1的元素开始删除3个元素
cout << str1 << endl; //hello
}
2.6求子串
功能:从字符串中获取想要的子串。
函数原型 | 实现的功能 |
string substr(int pos = 0,int n = npos) const | 返回由pos开始的n个字符组成的字符串 |
举例代码:(包括如何在邮箱中截取账号)
//string求子串
void text05() {
string str1 = "abcde";
string sub = str1.substr(1, 3); //下标为1,长度为3的子串,是bcd
cout << sub << endl;
//实际应用——在邮箱中截取账号
string str2 = "123456789@qq.com";
int pos = str2.find('@'); //找到@所在下标
string sub2 = str2.substr(0, pos); //从下标为0的位置开始截取长度为pos的字符串
cout << sub2 << endl;
}
以上就是我所总结的string容器基本语法及其用法的全部内容。