【C++】STL标准库之string

string类的简介

在c语言中,对于字符有char类型,对于字符串就没有内置类型了,字符串是给起始位置的指针,结尾以’\0’,这样做是有缺陷的,容易越界访问。
而在工作和刷题中,经常会看到以string作为字符串的类型,这种类型是c++标准库定义的一种专门管理字符串这种类型的。

总结来看:
1.字符串是表示字符序列的类。
2.并且c++标准库提供了丰富的接口,用于操作字符串,这样比我们自己用c库操作方便多了。
3.本质上讲,string是一个类,basic_string是它的类模板,string是这个类模板的一个实例,用的是char来实例化这个类模板。

常用的string类的接口

为了方便记忆,我们将常用的接口分为以下几类:

构造、容量、访问及遍历、修改、特殊非成员函数(友元函数实现的)

构造

函数名称功能
string()构造空字符串
string(const char* s)用c格式字符串构造string
string(size_t n, char c)string类对象中包含n个c的字符
string(const string& s)拷贝构造

对应写法

void test()
{
	string s1;
	string s2("1,2,3");
	string s3(10, 'a');
	string s4(s3);
}

需要注意的是:这里的构造函数,拷贝构造函数,都是深拷贝,也就是说,并不是编译器自动补充的,不是直接拷贝原来对象中的值,而是将对象中涉及到资源管理的地方,通过创建新的空间,实现了资源本身的拷贝

容量

函数名称功能
size返回字符串有效个数
length返回字符串有效个数
capacity返回总空间大小
empty检测是否为空字符串,为空返回true,不空返回false
clear将字符串清空
reserve为字符串开辟空间,可以开辟大于原来的空间,但是无法减小
resize将有效字符个数修改为n个,多出的字符用字符c填充

注意:当使用clear时,只是将有效字符个数清空为0,并不会在底层修改容量大小。
而reserve只会增大容量,不会减小容量
而resize可以增加有效元素个数,也可以减小有效元素个数。当大于容量后,也会扩大容量,而且在vs编译器中是1.5倍的方式扩容,而linux下的g++是以2倍方式扩容的。
当resize小于等于15时,会将字符串放入string内部的字符数组中,capacity大小就变成15了。

访问及遍历

函数名称功能
operator[]返回pos的位置,通过下标随机访问
begin+endbegin获取第一个位置的字符的迭代器,end获取最后一个位置下一个位置的迭代器
rbegin+rendrbegin获取最后一个位置下一个位置的迭代器,rend获取第一个位置的字符的迭代器
范围forc++11支持的通过范围for遍历字符串

注意有下列几种遍历字符串的方式:

//遍历字符串的方式
for(auto e : s1)
{
	cout << e << " ";
}
cout << endl;

for(size_t i = 0; i < s1.size(); ++i)
{
	cout << s1[i] << " ";
}
cout << endl;

string::iteritor it = s1.begin();
auto it = s1,begin();
while(it != s1.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

string::iteritor rit = s1.rbegin();
auto rit = s1.rbegin();
while(rit != s1.rend())
{
	cout << *rit << " ";
	++rit;
}
cout << endl;

修改

函数名称功能
push_back在字符串后,尾插字符c
append在字符串后,拼接一个字符串
operator+=在字符串后,追加一个字符串
c_str返回c格式的字符串
find+npos从pos位置开始向后找,返回找到的字符的位置
rfind从pos位置从后向前找,返回找到的字符的位置
substr在字符串的pos位置开始,截取n个字符,返回一个string类型的子字符串

注意:字符串查找的过程,需要搭配npos来使用,当没有找到时,find会返回npos(预先定义好的一个极大值,表示字符串的最终位置)

size_t start = 0, end = 0;
string s1("i like cpp");
while(end < s1.size())
{
	end = s1.find(" ", start);
	if(end == string::npos)
	{
		end = s1.size();
	}
	string tmp = s1.substr(start, end-start);
	start = end + 1;
}

特殊非成员函数

函数名称功能
operator+字符串拼接,不改变原字符串,传值返回,效率较低
getline获取一行,之前使用cin时,会从空格处分开
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值