【string】C++ 数据结构 string 字符串

今天是字符串 /(>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

总结

字符串看似简单,实际上零零碎碎的方法特别多,不好记,要多加练习。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值