需要添加头文件"string
string和string.h是不一样的头文件
string定义
string str1;
string str2="abcd";
string 中内容的访问
1
通过下标访问
如果要读入输出整个字符串只能用cin和cout
可以用c_str将string型数据转化成字符数组输出
string str="abcd";
printf("%s\n",str.c_str());
2
通过迭代器访问
string ::iterator it;得到迭代器it
#include<iostream>
#include<string>
using namespace std;
int main()
{
string dtr="abcd";
for(string::iterator it=str.begin();it!=str.end;it++)
{
cout<<*it<<endl;
}
}
string和vector一样是可以对迭代器直接进行加减某个数字的,如 str.begin()+3是可行的
3
string的函数有很多,但是有且并不常用。
(1)operator +=
这就是string的加法,可将两个string直接拼起来
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="123";
string str2="abc";
string str3;
str3=str1+str2;
str1+=str2;
cout<<str1<<endl;
cout<<str3<<endl;
return 0;
}
/*
结果是:
123abc
123abc
*/
(2)comqare operator
两个string类型可直接进行==,!=,<=,>=,<,>按字典序进行比较
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="aa ";
string str2="aaa";
string str3="abc";
string str4="xyz";
if(str1 < str2) cout<<"OK1"<<endl;
if(str1 != str2) cout<<"OK2"<<endl;
if(str4 >= str3) cout<<"OK3"<<endl;
return 0;
}
/*
结果
OK1
OK2
OK3
*/
(3)length() size()
length()返回长度,即存放字符数时间复杂度 O(1)
size()和length()基本相同
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str="abcxyz";
cout<<str.length()<<" "<<str.size()<<endl;
return 0;
}
/*
6 6
*/
(4)insert()
string的insert()函数有很多写法,时间复杂度为O(N)
1.insert(pos,string)在pos处插入string
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="abcxyz";
string str2="opq";
str1.insert(3,str2);
cout<<str1<<endl;
return 0;
}
/*
abcopqxyz
*/
2.insert(it1,it2,it3)
it1为预插入位置,it2,it3为待插字符串的首尾迭代器,[it2,it3)为插入的字符串
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="abcxyz",str2="opq";
str1.insert(str1.begin()+3,str2.begin(),str2.end());
cout<<str1<<endl;
return 0;
/*
abcopqxyz
*/
(5)erase()
erase()有两种用法,删除单个元素,删除一个区间的元素,时间复杂度O(N)
1.删除单个元素
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="abcxyz";
str1.erase(str1.begin()+3);
cout<<str1<<endl;
return 0;
}
/*
abcyz
*/
2.删除一个区间的所有元素
str.erease(first,last),即删除[first,last)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="abcxyz";
str1.erase(str1.begin()+1,str1.begin()+3);
cout<<str1<<endl;
return 0;
}
/*
axyz
*/
str.erase(pos,length),pos为删除起始位置,length为删除字符个数
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="abcxyz";
str1.erase(1,2);
cout<<str1<<endl;
return 0;
}
/*
axyz
*/
(6)clear()
clear()用于清空string的数据,时间复杂度为O(1)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="abcxyz";
str1.clear();
cout<<str1<<endl;
cout<<str1.length()<<endl;
return 0;
}
/*
'\n'str1为空所以不输出直接换行
0
*/
(7)substr()
substr(pos,len),返回一个从pos开始长度为len的字串,时间复杂度为O(len)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="How are you";
cout<<str1.substr(0,3)<<endl;
cout<<str1.substr(4,3)<<endl;
cout<<str1.substr(8,3)<<endl;
return 0;
}
/*
How
are
you
*/
(8)string::nops
string::npos为一个常数,本身值为-1,但由于是无符号整型(unsigned_int),所以也可以被认为是unsigned_int的最大值,string::npos是find函数(下面会说到)失配的返回值,所以可以认为string::npos的值是-1或者是4294967295
(9)find()
str.find(str2),当str2是str1的字串时,返回str1中第一次出现的位置,如果没有则返回string::npos
str1.find(str2,pos),从第pos位开始匹配返回值一样
时间复杂度为O(nm),nm分别是两个字串的长度
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="abcdefghigk";
string str2="bc";
string str3="**";
if(str1.find(str2)!=string::npos)
cout<<str1.find(str2)<<endl;
if(str1.find(str3,4)!=string::npos)
cout<<str1.find(str3,4)<<endl;
}
/*
1
*/
(10)replace
str.place(pos,len,str2),将str的pos位开始替换长度为len的str2
str.replace(it1,it2,str2),将str里面[it1,it2)替换为str2
时间复杂度为O(str.length())
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="abcdefghigk";
string str2="AB";
string str3="**";
cout<<str1.replace(0,2,str2)<<endl;
cout<<str1.replace(str1.begin(),str1.begin()+2,str3)<<endl;
}
/*
ABcdefghigk
**cdefghigk
*/