string用法
1,定义
string str;
初始化 ,可以直接给string类型的变量赋值;
string str = “abcd”;
⚠️:使用时,需要加上头文件
#include<string>
using namespace std;
2,string中内容访问
一般来说,可以直接像字符串数组一样取访问
示例:
#include<cstdio>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str = "abcd";
for (int i = 0; i < str.length(); ++i)
{
printf("%c", str[i]);
}
printf("\n");
return 0;
}
如果需要读入和输出整个字符串,则只能用cin和cout
示例:
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str;
cin>> str;
cout << str << endl;
return 0;
}
⚠️:printf也可以输出string,使用c_str()将string类型转为字符串数组进行输出
示例:
#include<cstdio>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str = "abcd";
printf("%s\n", str.c_str());
return 0;
}
2)通过迭代器访问
string不像其他STL容器那样需要参数,因此可以直接如下定义:
string::iterator it;
这样就得到了迭代器it,并且可以通过*it来访问string里的每一位
string和vetor一样,支持直接对迭代器进行减某个数字,如str.begin()+3的写法是可行的
#include<cstdio>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str = "abcd";
for (string::iterator it = str.begin(); it < str.end(); ++it)
{
printf("%c", *it);
}
printf("\n");
return 0;
}
3)string常用函数实例解析
1)operator+=
这是string的加法,可以将两个string直接拼接起来
示例:
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str1 = "abcd", str2 = "efg", str3;
str3 = str1 + str2;
str1 += str2;
cout<<str3<<endl;
cout<<str1<<endl;
return 0;
}
2)compare operator
两个string类型可以直接使用==、!=、<、<=、>、>=,比较规则是字典序。
#include<cstdio>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str1 = "aa", str2 = "aaa", str3 = "abc", str4 = "xyz";
if(str1 < str2) printf("OK1\n");
if(str2 != str3) printf("OK2\n");
if(str4 >= str3) printf("OK3\n");
return 0;
}
3)length()/size()
length返回string的长度,即存放的字符数,时间复杂度为O(1)
size()和length()基本相同
⚠️:strlen()和sizeof()区别
sizeof()是运算符,其值在编译时即计算好了
获得保证能容纳实现所建立的最大对象的字节大小。
strlen()是函数,字符串的实际长度,它求得方法是从开始到遇到第一个'\0’。
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str = "abcd";
// printf("%d %d\n", str.length(), str.size());
cout<< str.size()<<" "<<str.length()<<endl;
return 0;
}
4)insert()
下面几种写法时间复杂度为O(N)
a,insert(pos, string) 在pos号位置插入字符串string
示例:
string str1 = "abcxyz", str2 = "def";
str1.insert(3,str2);
//往str1[3]里插入def,str2的位置也可以直接写成“def”
printf("%s\n", str1.c_str());
b,insert(it,it2,it3),it为原字符串的欲插入的位置,it2和it3位待插入字符串的首位迭代器,用来表示串[it2,it3]将被插在it的位置上。
示例:
#include<cstdio>
//#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str1 = "abcxyz", str2 = "def";
//str1.insert(3,str2); //往str1[3]里插入def,str2的位置也可以直接写成“def”
str1.insert(str1.begin() + 3, str2.begin(), str2.end());
printf("%s\n", str1.c_str());
return 0;
}
5)erase()
erase()有两种用法,删除单个元素,删除一个区间内的所有元素,时间复杂度为O(n)
a,删除单个元素
str.erase(it)用于删除单个元素,it为需要删除的元素迭代器
b,删除一个区间内的所有元素
方法一:
str.erase(first,last),其中first为需要删除的区间的起始迭代器,而last为需要删除区间额末尾迭代器的下一个地址,也即为[first, last]
方法二:
str.erase(pos,length),其中pos为需要开始删除的其实位置,length为删除的字符个数
示例:
#include<cstdio>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str = "abcdefg";
//删除单个元素
//str.erase(str.begin()+4);
//删除区间内元素
//str.erase(str.begin() + 2, str.end() - 1);
str.erase(2,4);
printf("%s\n", str.c_str());
return 0;
}
6)clear()
作用:用以清空string中的数据,时间复杂度为O(1)
示例:
//#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str = "abcdefg";
str.clear();
cout<<str.size()<<endl;
return 0;
}
7)substr()
格式
substr(pos,len)返回从pos号位开始、长度为len的子串,时间复杂度为O(len)
示例:
//#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str = "Thank you for your smile.";
cout<<str.substr(0,5)<<endl;
cout<<str.substr(14,4)<<endl;
cout<<str.substr(19,5)<<endl;
return 0;
}
8)string::npos
string::npos是一个常数,但由于是unsign_int类型,因此实际上也可以认为是unsigned_int类型的最大值。
string::npos用作find函数失配时的返回值。
示例:
//#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
if(string::npos == -1){
cout<<"-1 is true!"<<endl;
}
if(string::npos == 4294967295){
cout<<"4294967295 is also true!"<<endl;
}
return 0;
}
9)find()
str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,那么返回str::npos
str.find(str2,pos),从str的pos号位开始匹配str2,返回值与上相同。
时间复杂度为O(nscm),其中n和m分别为str和str2的长度。
示例:
//#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str = "Thank you for your smile.";
string str2 = "you";
string str3 = "me";
if(str.find(str2) != string::npos){
cout<<str.find(str2)<<endl;
}
if(str.find(str2,7) != string::npos){
cout<<str.find(str2,7)<<endl;
}
if(str.find(str3) != string::npos){
cout<<str.find(str3)<<endl;
}else{
cout<<"No position!"<<endl;
}
return 0;
}
10)replace()
Str.replace(pos,len,str2)把str从pos号位开始、长度为len的子串替换为str2
str.replace(it1,it2,str2)把str的迭代器(it1,it2)范围的子串替换为str2
示例:
//#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
string str = "Maybe you will turn around.";
string str2 = "will not";
string str3 = "Surly";
cout<<str.replace(10,4,str2)<<endl;
cout<<str.replace(str.begin(),str.begin() + 5, str3)<<endl;
return 0;
}