今天是字符串 /(>o<)/ 看起来简单但是有很多杂七杂八的内容=_=
文章目录
1. 构造函数
常见的构造方法有以下几种:
string s; //创建一个空字符串
string s(int nSize, char c); //创建一个字符串,包含nSize个字符c
string s(string str); //复制一个字符串
string s(string str, int index); //复制字符串的一部分,从下标index开始直到末尾的子串
string s(string str, int index, int length); //复制字符串的一部分,从下标index开始,长度为length的子串
举个栗子:
string s1; ->si = ""
string s2(4, 'K'); ->"KKKK"
string s3("Hello"); ->"Hello"
string s4(s3, 1); -> "ello"
string s4(s3, 1, 3); -> "ell"
2. 赋值
比较特别的是,字符串可以接受单个字符类型的赋值。其他赋值方法都类似构造方法。
string s1 = 'K'; ->"K"
string s2 = "Hello"; ->"Hello"
string s3 = s2; ->"Hello"
另外还有 assign 成员函数,用来给字符串赋值,方法跟构造方法差不多。
s3.assign(4, 'K'); ->"KKKK"
s3.assign("Hello"); ->"Hello"
s3.assign("Hello", 1); ->"ello"
s3.assign("Hello", 1, 3); ->"ell"
3. 增删改查
说增删改查其实并不太准确啦哈哈哈
(1)增——连接字符串
运算符“+”和“+=”都可以直接用,也可以连接单个字符。
string s1 = "Hello";
s1 = s1 + ' ';
s1 += "world"; ->"Hello world"
(2)增——插入字符串
insert 成员函数可以在字符串的指定位置插入另一个字符串。
string s1("Hello"), s2("12345");
s1.insert(2, "123"); //在下标 2 处插入字符串"123" ->"He123llo"
s1.insert(3, s2, 2); //在下标 3 处插入 s2 从下标2开始直到末尾的子串, s1 = "Hel345lo"
s1.insert(3, s2, 1, 2); //在下标 3 处插入 s2 从下标1开始,长度为2的子串, s1 = "Hel23lo"
s1.insert(3, 4, 'K'); //在下标 3 处插入 5 个 'K',s1 = "HelKKKKlo"
这个参数还是可以参考构造方法
(3)删——删除子串
erase成员函数可以删除字符串中指定位置、指定长度的子串。
string s1("Hello world");
s1.erase(1, 3); //删除从下标1开始,长度为3的子串 ->"Ho world"
s1.erase(5); //删除下标5及其后面的所有字符 ->"Hello"
(4)删——截取字符串
substr成员函数可以从字符串中截取子串(n,m),即从下标n开始,长度为m的子串。当省略参数m或m大于字符串长度时,截取从n开始直到末尾的子串。
string s1 = "Hello world";
string s2 = s1.substr(2, 7); ->"llo wor"
s2 = s2.substr(4); ->"wor"
(5)改——替换子串
replace成员函数可以对字符串中的子串进行替换。
string s1("Hello");
s1.replace(1, 3, "xxx"); //前两个参数代表原字符串需要替换掉的子串(1,3) ->"Hxxxo"
s1.replace(1, 3, "xxxwww", 1, 4); //后两个参数代表替补字符串的子串(1,4) ->"Hxxwwo"
s1.replace(1, 3, 5, 'i'); //用5个'i'替换子串(1,3) ->"Hiiiiio"
(6)查——查找子串和字符
find 和 rfind 成员函数,区别在于一个从前往后查找,另一个从后往前查找,参数可以是单个字符,也可以是子串,返回值是int型的下标,如果匹配失败则返回 -1。
string s1("Hello world");
int pos = s1.find('o'); -> 4
pos = s1.rfind('o'); -> 7
pos = s1.find("lo"); -> 3
找资料的时候我震惊了,查找居然有那——么——多——的成员函数,而我之前只用过一个find,知道一个rfind也是从来没用过。就先写这两个吧,剩下的记在下面,感觉一般不太用得上。
find_first_of:从前往后查找何处出现另一个字符串中包含的字符
例如: s1.find_first_of(“abc”); //查找s1中第一次出现"abc"中任一字符的位置
find_last_of:从后往前查找何处出现另一个字符串中包含的字符。
find_first_not_of:从前往后查找何处出现另一个字符串中没有包含的字符。
find_last_not_of:从后往前查找何处出现另一个字符串中没有包含的字符。
4. 比较
字符串之间的比较可以直接用 <、<=、==、!=、>=、> 这些基础运算符,也可以使用compare成员函数,compare返回一个int值。
string s1("hello"), s2("Hello");
int n = s1.compare(s2); -> 1 //返回值 >0 时表示s1 > s2
n = s1.compare(1, 2, s2, 0, 3); //比较s1的子串 (1,2) 和s2的子串 (0,3)
n = s1.compare(1, 2, s2); // 比较s1的子串 (1,2) 和 s2
//注意:s1不带参数s2带参数是不行的,s2要带参数,s1必须有参数。
5. 求字符串长度
int length = str.length();
length = str.size() //这两个效果一样
6. string与int类型的互相转换
string to_string(int num) //int转string
int stoi(string str) //string转int
long stol(string str) //string转long
举个栗子:
string s1 = "12345";
int num = stoi(s1); -> 12345
string s2 = to_string(num); ->"12345"
7. 输入输出流
流对象 istringstream 和 ostringstream,需要包含头文件#include <sstream>
。
举个栗子(输入流):
string s="how are you ?";
istringstream words(s); //按空格分割字符串
string w;
while (words >> w) {
cout<<w<<endl;
}
输出结果:
how
are
you
?
输入流在处理句子,或者这种空格隔开的字符串的时候很好用。输出流我暂时还没用上过。
举个栗子(输出流):
string s1="123",s2="456",s3="789";
ostringstream ostr;
ostr << s1 << " " << s2 << " " << s3;
cout << ostr.str();
输出结果:
123 456 789
总结
字符串看似简单,实际上零零碎碎的方法特别多,不好记,要多加练习。