前几天写过一篇C语言的string.h使用方法(传送门:https://www.mmuaa.com/post-80.html)
然而发现在windows下Dev-c++可以正常使用,但是在Linux下使用g++编译器有一些函数无法使用,例如strrev等等。而在C++的标准模板库(STL)中为我们提供了更加简单的字符串操作方法。
0x01、定义
首先引入头文件并使用命名空间
#include <string>
using namespace std;
注意,string.h和string不是同一个东西!!!
接着,string就可以作为一个类型去使用了。定义字符串可以这样定义:
string str;
如果想初始化,你也可以这样:
string str = "hahaha";
这样我们就成功定义了一个字符串。
0x02、读入和输出
使用scanf("%s")读取string定义的字符串会导致程序崩溃,我们这里使用cin读入字符串。而cin存在iostream的头文件内,所以在开头添加
#include <iostream>
接着用cin读入
cin>>str; //读入
cout<<str; //输出
这里使用了cout进行输出,我们也可以使用printf进行输出:
printf("%s", str.c_str());
这里的c_str()用途是将string类型的字符串转换为char*字符数组
0x03、通过迭代器访问
与vector类似,string也可以通过迭代器进行访问。迭代器,你可以把它理解成是一个指针,指向string中的某个元素。
首先我们定义一个string的迭代器:
string::iterator it;
it = str.begin(); //迭代器it指向string的开头
这时就可以通过*it访问元素了。string的迭代器支持使用*(it + 1)的方式访问元素。
0x04、其他常用函数
str+= string类型的字符串可以进行类似PHP等语言的字符串拼接,例如
#include <string>
#include <iostream>
using namespace std;
int main(void){
string str1, str2;
cin>>str1;
cin>>str2;
str1 += str2;
cout<<str1<<endl;
return 0;
}
运行结果
<,>,= string字符串之间可以直接比较大小,比较的规则是字典序。
length(),size() 两个函数都可以返回字符串的长度,即字符数量。时间复杂度为O(1)。注意,一个汉字或占两个字符。例如
#include <cstdio>
#include <string>
using namespace std;
int main(void){
string str1;
cin>>str1;
printf("%d %d",str1.length(),str1.size());
return 0;
}
运行结果
insert(x,str) 可以在x位置的后面插入字符串str。时间复杂度为O(str.lengh)。例如
#include <string>
#include <iostream>
using namespace std;
int main(void){
string str = "abcdefg";
str.insert(2,"ppppp");
cout<<str<<endl;
return 0;
}
运行结果
insert(it,it_start,it_end) 这个函数可以将区间表示为[it_start,it_end)范围内的字符串插入到it的位置。这三个参数都是迭代器。
erase(it) 可以删除迭代器it指向的元素。
erase(it_begin,it_end) 可以删除一个区间内的元素。
erase(n,length) 可以删除从n号位置开始(不包括n号位),删掉length个元素。
clear() 可以清空string中的元素。
substr(n,length) 可以返回从n号位置开始,不包括n号位置,长度为length的字符串。
find(str2) 可以用于在str1中查找str2,如果找到了则返回第一次出现str2的位置(第str2+1个字符),如果找不到则返回string::npos。这里string::npos是一个unsign int类型的常量,等于unsign int所能表示的的最大值。这里举一个例子:
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
int main(void){
string str;
int i = 0;
while(1){ //便于多次测试
cin>>str;
while(1){
i = str.find("ha",i) + 1;
if( i-1 == string::npos ){ //如果没找到,提示没找到,并跳出循环
printf("没了,滚吧,再问老子打死你\n");
break;
}
printf("在第%d个字处出现了ha\n",i);
}
str.clear();
i = 0;
}
return 0;
}
运行结果
要特别注意find返回的是从0开始查的字符位置,想知道是第几个字符串需要把返回值+1