文章目录
- 1. 基本概念
- 1.1 本质
- 1.2 string与char*的区别
- 1.3 特点
- 2. 构造函数
- 2.1 四种构造
- 2.2 举例展示
- 3. 赋值操作
- 3.1 七种赋值函数原型(operator等号赋值/assign成员函数赋值)
- 3.2 举例展示
- 4. 拼接操作
- 4.1 七种拼接函数原型
- 4.2 举例展示
- 5. 查找操作
- 5.1 八种查找函数原型
- 5.2 find和rfind 相同点和区别
- 5.3 举例展示
- 6. 替换操作
- 6.1 两种函数原型
- 6.2 举例展示
- 6.3 深度思考
- 7. 今日完成情况
- 8. 明天任务计划
- 埋下的种子终会开花!
请不要相信,胜利像山坡上的蒲公英那样唾手可得!但请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!
1. 基本概念
1.1 本质
string
是C++中的字符串,本质是一个类
1.2 string与char*的区别
那有小伙伴会问了,C++中的string和C中的char*有区别呢???
答案如下:
char*
是一个指针string
是一个类,类内部封装了char*
,管理这个字符串,是一个char*
型的容器,使用时需加头文件#include<string.h>
1.3 特点
- string类内部封装了很多成员方法(举几个常见的例子)
find
查找copy
构造delete
删除replace
替换insert
插入
string
管理char*
所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
2. 构造函数
2.1 四种构造
- 无参(默认)构造
string();
直接创建一个空的字符串 - 传参构造
string(const char* s);
通过传入C的字符串来构造出C++的string类型字符串 - 拷贝构造
string(const string& str);
通过一个已知的string类型的str初始化另一个string对象 - 字符构造(需要给定字符的个数n)
string(int n,char ch);
通过n个字符ch进行初始化
2.2 举例展示
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
//string的构造函数
void text01() {
string s1; //默认构造
const char *str = "123abc";
string s2 (str); //传参构造
cout << "s2=" << s2 << endl;
string s3(s2); //拷贝构造
cout << "s3=" << s3 << endl;
string s4(8, 'x');
cout << "s4=" << s4 << endl;
}
int main() {
text01();
}
3. 赋值操作
3.1 七种赋值函数原型(operator等号赋值/assign成员函数赋值)
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=(cosnt string&s);
把字符串s赋值给当前字符串string& assign=(int n,char c);
把n个字符c赋给字符串
3.2 举例展示
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
//string赋值操作
void text01() {
string s1;
s1 = "hello world";
cout << "s1=" << s1 << endl;
//直接用等号将"hello world"赋值给s1
string s2;
s2 = s1;
cout << "s2=" << s2 << endl;
//用等号的引用传递将s1赋值给s2
string s3;
s3 = 'a';
cout << "s3=" << s3 << endl;
//直接用等号传字符给s3
string s4;
s4.assign("Hi,friends!");
cout << "s4=" << s4 << endl;
//用成员函数将"Hi,friends!"赋给s4
string s5;
s5.assign("helloworld", 5);
cout << "s5=" << s5 << endl;
//用成员函数将"helloworld"的前5个字符赋给s4
string s6;
s6.assign(s5);
cout << "s6=" << s6 << endl;
//用成员函数将s5赋给s6
string s7;
s7.assign(8, 'k');
cout << "s7=" << s7 << endl;
//用成员函数将8个k赋给s7
}
int main() {
text01();
}
4. 拼接操作
4.1 七种拼接函数原型
string& operator+=(const char*s);
重载+=操作符,结尾处拼接一个字符串string& operator+=(char c);
重载+=操作符,结尾处拼接一个字符string& operator+=(const string&s);
重载+=操作符,结尾处拼接一个为s的字符串string& assign=(const char*s);
把字符串s连接到当前字符串结尾string& assign=(const char*s,int n);
把字符串s的前n个字符连接到当前字符串结尾string& assign=(cosnt string&s);
同operator+=(const string& str)string& assign=(const string&s,int pos,int n);
字符串s中从pos开始的n个字符连接到字符串结尾
4.2 举例展示
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
void text01() {
//用 “+=” 运算符
string s1 = "二〇二三,";
s1 += "跟着阿亮学STL";
cout << "s1=" << s1 << endl;
//拼接一个字符串
s1 += '!';
cout << "s1=" << s1 << endl;
//拼接一个字符
string s2 = "行嘛?";
s1 += s2;
cout << "s1=" << s1 << endl;
//用+=拼接一个string类型的字符串
}
void text02() {
string s1 = "I";
s1.append(" Love ");
cout << "s1=" << s1 << endl;
//直接拼接字符串
s1.append("You.wQ12ea0=adjf", 4);
cout << "s1=" << s1 << endl;
//拼接字符串前n个字符
string s2 = " And do you love me, too??? ";
s1.append(s2);
cout << "s1=" << s1 << endl;
//用.append拼接一个string类型的字符串
string s3 = "I love, but ……";
s1.append(s3, 0, 6);
cout << "s1=" << s1 << endl;
//从s3的第0个字符,向后截取6个字符
//string& assign=(const string&s,int pos,int n);
//从字符串的pos开始截取,向后截取n个字符
}
int main() {
text01();
cout << endl;
text02();
return 0;
}
5. 查找操作
5.1 八种查找函数原型
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, 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 frind(const char c, int pos = 0) const;
查找字符c最后一次出现的位置
5.2 find和rfind 相同点和区别
- 相同点:
- find和rfind查找字符串时默认都是返回int类型的下标的值,找到立即停止,不会再往下继续找
- 如果查找不到,则返回-1
- 不同点:
- find是从左往右查找,找的是第一次出现的位置;rfind是从右往左查找,找最后一次出现的位置
- 如果不特别标明pos,find默认从第一个字符开始索引,rfind默认从最后一个开始索引
5.3 举例展示
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
//字符串查找
void text01() {
//用find查找
// 默认从下标为0处开始查找第一次出现的位置
string s1 = "abcdefgbc";
int pos1 = s1.find("bc");
cout << "pos1=" << pos1 << endl;
//从下标为2处开始查找,找不到返回-1
int pos11=s1.find("bc",2);
cout << "pos1=" << pos11 << endl;
//表示从s2下标为0处找字符串前4个字符第一次的位置
string s2 = "abcdefgfabceabc";
int pos2 = s1.find("abcef", 0 , 4);
cout << "pos2=" << pos2 << endl;
//表示从s1下标为5处开始找第一次出现字符f的位置
int pos3 = s1.find('f' , 5);
cout << "pos3=" << pos3 << endl;
}
void text02() {
//用refind查找
//默认从最后一个元素开始往前查找字符串最后一次出现的位置
string s1 = "abcdefgabcabdersdabcdefsbfabh";
int pos1 = s1.rfind("d2e");
cout << "pos1=" << pos1 << endl;
//从下标为pos开始向前查找字符串最后一次出现的位置,找不到返回-1
int pos2 = s1.rfind("def", 2);
int pos22 = s1.rfind("def", 18);
cout << "pos2=" << pos2 << endl;
cout << "pos22=" << pos22 << endl;
//从下标为pos开始向前查找字符串的前n个字符最后一次位置
int pos3 = s1.rfind("abcdtyrref", 30, 4);
cout << "pos3=" << pos3 << endl;
//从下标为pos处向前索引找到字符c最后一次出现的位置
int pos4 = s1.rfind('c', 21);
cout << "pos4=" << pos4 << endl;
}
int main() {
text01();
cout << "----------------------------------------------------" << endl;
text02();
return 0;
}
6. 替换操作
6.1 两种函数原型
string& replace(int pos, int n, const string& str);
替换从pos开始n个字符为字符串strstring& replace(int pos, int n, const char*s);
替换从pos开始的n个字符为字符串s- 解释为从……位置起,多少个字符,替换为……的字符串
6.2 举例展示
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
void text01() {
//从下标为1处替换字符串的前3个字符,则"bcd"改为"123",s1="a123efg"
string s1 = "abcdefg";
s1.replace(1, 3,"123");
cout << "s1=" << s1 << endl;
}
int main() {
text01();
return 0;
}
6.3 深度思考
string& replace(int pos, int n, const char*s);
所替换的字符串s中字符的个数小于等于n的值还好说(即所替换字符串数比原字符串str需要换的字符数比小,直接替换即可)(也就是要的多,给的少,多换少,直接换进行),但如果所替换的字符串s中字符的个数大于需要替换字符的个数n的值怎么办呢???(即要换的少,给你的多,少换多,你是一个字符换一个字符这么算还是直接删去原来较少的字符,全部换成较多的字符)
举个例子来说
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
void text02() {
string s2 = "abcdefg";
s2.replace(1, 3, "1234");
cout << "s2=" << s2 << endl;
//答案是"a123efg"还是"a1234efg"
}
int main() {
text02();
return 0;
}
正确思路为从1号位置起的3个字符"bcd"替换为”1234“,即先删掉原字符串的字符,再直接把替换的加上
7. 今日完成情况
今天上午一直在串门,没有太长时间,也没学太多QAQ
- 线性代数第一章第三节课程+习题
- STL中string容器(上)
- 每日一题
8. 明天任务计划
- 线性代数第一章第四、五节+习题
- STL中string容器(下)、vector容器、deque容器
- 每日一题
- Java第三章