C++第十六弹---string使用(上)

✨个人主页:熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】

目录

1、标准库中的string类

1.1、string类的常用接口说明

1.1.1、string类对象的常见构造

1.1.2、string类对象的容量操作

1.1.3、string类对象的访问及遍历操作

总结


根据前面一弹我们知道string实质是一个类,既然讲述的是类,那必然我们需要从构造函数开始说起,以下文正文内容。

1、标准库中的string类

注意:因为标准库中的string类接口函数较多,高达100多个,所以博主只对一些比较常见的接口函数进行使用和模拟,如果想要全部使用的话可以看前面一弹博主推荐的网站进行查询。

1.1、string类的常用接口说明

1.1.1、string类对象的常见构造

1、string(); // 无参构造,构造空string类,只有\0。
2、string(const string & str);// 拷贝构造 将string类str拷贝到类中。
3、string(const string & str, size_t pos, size_t len = npos);
static const size_type npos = -1;
拷贝构造 将string类str从pos位置拷贝len个长度到类中,默认长度为npos,npos为-1,
但是类型为无符号整数类型,因此npos为无符号整数最大值,库规定len大于字符串长度,则拷贝整个str则结束。
4、string(const char* s);// 将字符串s拷贝到类中
5、string(const char* s, size_t n);// 将字符串的前n个拷贝到类中
6、string(size_t n, char c);// 拷贝n个字符c到类中

int main()
{
	string s1;//无参构造 只有\0
	string s2("hello world");//将括号内字符串拷贝给s2
	string s3("hello world", 0, 2);//将括号内的字符串从第0个位置拷贝2个元素给s3
	string s4(s2);//拷贝构造 将s2类拷贝给s4
	string s5(s2, 5);//拷贝构造 将s2类的前5个字符拷贝给s5
	string s6(10, 'a');//拷贝n个字符a给s6

	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	cout << s6 << endl;
	return 0;
}

1.1.2、string类对象的容量操作

1、size_t size() const;//获取字符串有效字符长度
2、size_t length() const;//获取字符串有效字符长度
3、size_t capacity() const;//获取字符串容量
4、bool empty() const;//检测字符串释放为空串,是返回true,否则返回false
5、void clear();//清空有效字符
6、void reserve(size_t n = 0);//为字符串预留空间
7、void resize(size_t n);//将有效字符的个数该成n个,即扩容
8、void resize(size_t n, char c);//将有效字符的个数该成n个,多出的空间用字符c填充

int main()
{
	string s1("hello world");
	cout << s1.size() << endl;//计算s1的有效数据个数
	cout << s1.length() << endl;//计算s1的有效数据个数
	cout << s1.capacity() << endl;//计算s1的容量
	cout << s1.empty() << endl;//判断s1是否为空串
	s1.clear();//清空字符串数据
	s1.reserve(50);//扩大容量至50字节
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.resize(30);//扩大有效数据至30,大于原来的大小则用\0填充
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.resize(30, 'a');//扩大有效数据至30,大于原来的大小则用字符a填充
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
    return 0;
}

注意:

**1.**size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一 致,一般情况下基本都是用size()。

**2.**clear()只是将string中有效字符清空,不改变底层空间大小。

**3.**resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字 符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的 元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大 小,如果是将元素个数减少,底层空间总大小不变。

**4.**reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于 string的底层空间总大小时,reserver不会改变容量大小。

1.1.3、string类对象的访问及遍历操作

1、 char& operator[] (size_t pos);//访问pos位置的值,可以修改值
2、 const char& operator[] (size_t pos) const;//同上,唯一区别是不能修改值
3、 char& at (size_t pos);//通过函数方式访问pos位置的值,可以修改值
4、 const char& at (size_t pos) const;//同上,唯一区别是不能修改值
5、 char& back();//访问字符串最后一个字符,可以修改值
6、 const char& back() const;//同上,唯一区别是不能修改值
7、 char& front();//访问字符串第一个字符,可以修改值
8、 const char& front() const;//同上,唯一区别是不能修改值
9、 iterator begin();//指向字符串首元素的迭代器(暂时可以理解为指针),可以修改值
10、const_iterator begin() const;//同上,唯一区别是不能修改值
11、iterator end();//指向字符串最后一个元素的下一个位置迭代器(暂时可以理解为指针),可以修改值
12、const_iterator end() const;//同上,唯一区别是不能修改值
13、范围for 底层为迭代器

注意:迭代器还有rbegin,rend,cbegin,cend等,这些不怎么常用,可以自己查文档了解。

int main()
{
	string s("hello world");
	cout << s[1] << endl;//打印下标为1的字符
	s[1]++;
	cout << s[1] << endl;//打印下标为1的字符
	cout << s.at(2) << endl;//打印下标为2的字符
	cout << s.front() << endl;//打印字符串首字符
	cout << s.back() << endl;//打印字符串尾字符
	//1、下标访问字符串
	for (int i = 0; i < s.size(); i++)
	{
		cout << s[i] << " ";
	}
	cout << endl;
	//2、迭代器访问字符串
	string::iterator it = s.begin();//指向首字符的迭代器
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//3、范围for访问字符串
	for (auto ch : s)
	{
		cout << ch << " ";
	}
	cout << endl;
	return 0;
}

总结

本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

相关推荐
奶香臭豆腐8 分钟前
C++ —— 模板类具体化
开发语言·c++·学习
游是水里的游13 分钟前
【算法day19】回溯:分割与子集问题
算法
不想当程序猿_14 分钟前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
晚夜微雨问海棠呀15 分钟前
长沙景区数据分析项目实现
开发语言·python·信息可视化
graceyun16 分钟前
C语言初阶习题【9】数9的个数
c语言·开发语言
cdut_suye25 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
南城花随雪。33 分钟前
单片机:实现FFT快速傅里叶变换算法(附带源码)
单片机·嵌入式硬件·算法
dundunmm1 小时前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神1 小时前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法