string类(上)

🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【C++的学习】
📝📝本篇内容:标准库中的string;string类对象的常见构造;string类对象的容量操作
⬆⬆⬆⬆上一篇:C++模板初阶
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-

1.标准库中的string类

string是表示字符串的字符串类
string在底层实际是:basic_string模板类的别名,typedef basic_string<char,char_traits,allocator>string
在使用string类时,必须包含#include头文件以及using namespace std;

2.string类对象的常见构造

①string()

构造空的string类对象,即空字符串
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s;
	cout << s << endl;



	return 0;
}

②string(const char* s)

用c-string来构造string类对象
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	cout << s << endl;



	return 0;
}

③string(size_t n,char c)

string类对象中包含n个字符c
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s(10,'c');
	cout << s << endl;



	return 0;
}

④string(const string&s)

拷贝构造函数
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s(10,'c');
	string s1(s);
	string s2 = s;
	cout << s << endl;
	cout << s1 << endl;
	cout << s2<< endl;
	return 0;
}

⑤string(const string& str,size_t pos,size_t len=npos)

复制从字符位置pos开始并跨越len字符的str部分(如果str太短或len为string::npos,则复制到str结尾)
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	string s1(s,6,5);
	cout << s1<< endl;
	return 0;
}

在这里插入图片描述
上图是文档中查到的npos,他是一个无符号的unsigned int,值又是-1,所以说它就是无符号整形的最大值,因此,当你参数len作为缺省值或者大于str的长度时,他就是复制到str结尾
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	string s1(s,6);
    cout <<s1 << endl;

	return 0;
}

⑥string(const char* s,size_t n)

从由s指向的字符数组中复制前n个字符
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world",5);
	cout << s << endl;
	return 0;
}

3.string类对象的容量操作

①size

返回字符串有效字符长度
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	cout << s.size()<<endl;
	return 0;
}

②length

返回字符串有效字符长度
在这里插入图片描述
和size功能一样,由于历史原因,所以说会有length,但是推荐使用size

③capacity

返回空间总大小
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	cout << s.capacity()<<endl;
	return 0;
}

④empty

检测字符串是否为空串,是返回true,否则返回false
在这里插入图片描述
在这里插入图片描述

⑤clear

清空有效字符
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	 s.clear();
	 cout << s.size() << endl;
	 cout << s.capacity() << endl;
	return 0;
}

可以看出clear只是清空有效字符,但不会缩容

⑥reserve

为字符串预留空间
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	s.reserve(100);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	return 0;
}

可以把空间提前开大,但是打印出来的capacity大小并不是所设置的,这是因为还存在编译器对齐等各种原因,但是无论怎么样,开出的空间肯定大于等于你所设置的参数

⑦resize

将有效字符的个数改成n个,多出的空间用字符c填充
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	s.resize(20,'c');
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
	return 0;
}

注意:
1.size()和length()方法底层实现完全原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是使用size()
2.clear()只是将string中有效字符清空,不改变底层空间大小
3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize是用0来填充多出的元素空间,resize(size_t n,char c)是用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果将元素个数增多,可能会改变底层容量大小,如果是将元素个数减少,底层空间总大小不变
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。知道需要多少空间,提前开空间,减少扩容,提高效率

当resize没给第二个参数时:
在这里插入图片描述
当resize的参数小于字符串有效长度时:
在这里插入图片描述
可以看出resize的参数小于字符串有效字符时,会进行清除字符

🌸🌸string类(上)的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

轩情吖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值