STL——string详细用法

需要添加头文件"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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数学小牛马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值