STL库--string

目录

string的定义

string中内存的访问

string常用函数实例解析

string的定义

定义string的方式跟基本类型相同,只需要在string后跟上变量名即可:

string str;

如果要初始化,可以直接给string类型的变量进行赋值:

string str="abcd";

string中内存的访问

(1)通过下标访问

一般来说,可以直接像字符数组那样来访问string:

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str="abcd";
	for(int i=0;i<str.length();i++){
		printf("%c",str[i]);
	}
	return 0;
}

如果要读入和输出整个字符串,则只能用cin和cout

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str;
	cin>>str;
	cout<<str;
	return 0;
}

上面的代码对任意的字符串输入,都会输出同样的字符串。

那么,其实也可以使用printf来输出string,即用c_str()将string类型转换为字符数组进行输出。

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str="abcd";
	printf("%s\n",str.c_str());
	return 0;
}

(2)通过迭代器访问

一般仅通过(1)即可满足访问的要求,但是有些函数比如insert()与erase()则要求以迭代器为参考。

由于string不像其它STL容器那样需要参数,因此可以直接如下定义:

string::iterator it;

这样就得到了迭代器it,并且可以通过*it来访问string里的每一位:

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str="abcd";
	for(string::iterator it=str.begin();it!=str.end();it++){
		printf("%c",*it);
	}
	return 0;
}

最后指出,string和vector一样,支持直接对迭代器进行加减某个数字,如str.begin()+3的写法是可行的。

string常用函数实例解析

(1)operator+=

这是string的加法,可以将两个string直接拼接起来

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str1="abc",str2="xyz",str3;
	str3=str1+str2;//将str1和str2拼接起来,赋值给str3
	str1+=str2;//将str2直接拼接到str1上
	cout<<str1<<endl;
	cout<<str3<<endl;
	return 0; 
}

(2)compare operator

两个string类型可以直接使用==、!=、<、<=、>、>=比较大小,比较规则是字典序。

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str1="aa",str2="aaa",str3="abc",str4="xyz";
	if(str1<str2){
		printf("ok1\n");
	}
	if(str1!=str3){
		printf("ok2\n");
	}
	if(str4>=str3){
		printf("ok3\n");
	}
	return 0;
}

(3)length()/size()

length()返回string的长度,即存放的字符数,时间复杂度为O\left ( 1 \right )。size()与length()基本相同。

string str="abcxyz";
printf("%d %d\n",str.length(),str.size());

(4)insert()

string的insert()函数有很多种写法,这里给出几个常用的写法,时间复杂度为O\left ( N \right )

1.insert(pos,string),在pos号位置插入字符串string

string str="abcxyz",str2="opq";
str.insert(3,str2);

输出结果

abcopqxyz

2.insert(it,it2,it3)

it为原字符串的欲插入位置,it2和it3为待插字符串的首尾迭代器,用来表示串[it2,it3)将被插在it的位置上。

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="abcxyz",str2="opq";
	//在str的3号位(即c和x之间)插入str2 
	str.insert(str.begin()+3,str2.begin(),str2.end());
	cout<<str<<endl;
	return 0;
}

(5)erase()

erase()有两种用法:删除单个元素,删除一个区间内的所有元素,时间复杂度均为O\left ( N \right )

1.删除单个元素

str.erase()用于删除单个元素,it为需要删除的元素的迭代器

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="abcdefg";
	str.erase(str.begin()+4);
	cout<<str<<endl;
	return 0;
} 

输出结果

abcdfg

2.删除一个区间内的所有元素

删除一个区间内的所以元素有两种方法:

str.erase(first,last),其中first为需要删除的区间的起始迭代器,而last则为需要删除的区间的末尾迭代器的下一个地址,也即为删除[first,last)

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="abcdefg";
	str.erase(str.begin()+2,str.end()-1);
	cout<<str<<endl;
	return 0;
}

输出结果 

abg

str.erase(pos,length),其中pos为需要开始删除的起始位置,length为删除的字符个数。

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="abcdefg";
	str.erase(3,2);
	cout<<str<<endl;
	return 0;
}

输出结果

abcfg

(6)clear() 

clear()用以清空string中的数据,时间复杂度一般为O\left ( 1 \right )

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str="abcd";
	str.clear();
	printf("%d\n",str.length());
	return 0;
}

(7)substr()

substr(pos,len)返回从pos号位开始,长度为len的子串,时间复杂度为O\left ( len \right )

#include<iostream>
#include<string>
using namespace std;
int main(){
	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;
} 

输出结果

Thank
your
smile

(8)string::npos

string::npos是一个常数,其本身的值为-1,但由于是unsigned_int类型,因此实际上也可以认为是unsigned_int类型的最大值。string::npos用以作为find函数失配时的返回值。例如在下面的实例中可以认为string::npos等于-1或者4294967295.

#include<iostream>
#include<string>
using namespace std;
int main(){
	if(string::npos==-1){
		cout<<"-1 is true."<<endl;
	}
	if(string::npos==4294967295){
		cout<<"4294967295 is also true."<<endl;
	}
	return 0;
}

输出结果

-1 is true.
4294967295 is also true.

(9)find()

str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,那么返回string::npos

str.find(str2,pos),从str的pos号位开始匹配str2,返回值与上相同。

时间复杂度为O\left ( nm \right ),其中n和m分别是str和str2的长度。

#include<iostream>
#include<string>
using namespace std;
int main(){
	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<<"I know there is no position for me."<<endl;
	}
	return 0;
}

输出结果

6
14
I know there is no position for me.

(10)replace()

str.replace(pos,len,str2)把str从pos号位开始,长度为len的子串替换为str2

str.replace(it1,it2,str2)把str的迭代器[it1,it2)范围的子串替换为str2

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="Maybe you will turn around.";
	string str2="will not";
	string str3="surely";
	cout<<str.replace(10,4,str2)<<endl;
	cout<<str.replace(str.begin(),str.begin()+5,str3)<<endl;
	return 0;
}

输出结果

Maybe you will not turn around.
surely you will not turn around.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

互联网的猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值