string【C++入门】

P. S.:以下代码均在VS2022环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

在这里插入图片描述

                                           博主主页:LiUEEEEE
                                                C++专栏
                                              C语言专栏
                                            数据结构专栏
                                            排序算法专栏
                                         力扣牛客经典题目专栏

1、前言


  本章节所讲述内容供给初识string的学习者阅读,主要讲述string中常用的一些函数及其使用方法,并不对string底层进行研究,读者慎选。




2、string概念


  

         string类的文档介绍链接

  1. 字符串是表示字符序列的类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总结:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>
    string;
  4. 不能操作多字节或者变长字符的序列。

在使用string类时,必须包含#include头文件以及using namespace std;




3、成员操作函数


3.1 构造函数

在这里插入图片描述
  如上所示,是string类的构造函数,其使用方法按照由上至下顺序依次介绍:

	(1)string(const char* s);
	string s1("hello world");将一串字符作为参数初始化s1,且此字符串为常量不可修改

	(2)string();
	string s2;创建一个空的串,其大小内容均为空。
	
	(3)string(const string & str);
	string s3(s1);将s1的内容作为参数来初始化s3,且s1不可修改。

	(4)string(const string & str, size_t pos, size_t len = npos);
	string s4(s1, 6, 2);将s1从下标为6的位置开始,后两个字符作为参数初始化s4。
	string s5(s1, 6);将s1从下标为6的位置开始,后有多少个字符就使用多少个字符作为参数初始化s5。

	(5)string(const char* s, size_t n);
	string s6("hello world", 5);将字符串前n个字符作为参数初始化s6。

	(6)string(size_t n, char c);
	string s7(5, 'x');将n个字符c作为参数初始化s7。

	(7)template <class InputIterator>
	string(InputIterator first, InputIterator last);
	上述代码为模板代码,旨在创建一个通用模板方便对于string类对象的初始化



3.2 operator=

在这里插入图片描述
  重载等号相当于便利了string 类的初始化,例如:

	string s1("hello");
	
	string s2 = s1;
	string s3 = "hello";
	s3 = 'x';

  但要注意的是,不可以直接在创建串时传递单个字符,如果等号后所传递的为单个字符,相当于是重置了串中的内容,只能使用已经创建好的串来接收。
在这里插入图片描述
在这里插入图片描述




4、迭代器(iterator)


  迭代器与C语言中的指针有类似的使用方法,但其本质与指针拥有巨大的差别,目前的学习阶段暂且可以认为迭代器就是一个指针,指向串中数据的所在位置的下标。 ## 4.1 正向迭代器
  顾名思义其规则是从串的头部为起点,尾部为终点进行遍历。

在这里插入图片描述
在这里插入图片描述
  其主要用途在现阶段是为了方便访问串中的元素,例如使用者想遍历串打印其中所存放的每一个数据,可以如下操作:

	string s("hello world");
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

  值得注意的是,其中的 begin() 所返回的是第一个数据所在下表位置,而 end() 所返回的并不是最后一个数据的下标,而是最后一个数据的下一个位置的下标,且当传入的数据串为const类型时,无法通过迭代器对其进行修改,仅可读。



4.2 反向迭代器


  顾名思义其规则是从串的尾部为起点,头部为终点进行遍历。

在这里插入图片描述
在这里插入图片描述  其主要用途是反向打印串中的每一个数据,如下操作:

	string s("hello world");
	string::reverse_iterator it = s.rbegin();
	while (it != s.rend())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

  值得注意的是,当使用者使用反向迭代器时需要对迭代器进行正向操作,也需要使用++,而不是 - -,因为其逻辑为反向迭代器的迭代方向为+,如果使用 - 则会报错。
在这里插入图片描述




5、串空间操作函数(capacity)

5.1 size


在这里插入图片描述  此函数的主要作用为返回当前串的大小,单位为字节。
在这里插入图片描述

5.2 length


在这里插入图片描述
  此函数的主要作用是返回当前串的长度,单位为字节。
在这里插入图片描述
  需注意此长度统计函数不统计串末尾 "\0"所占长度。

5.3 max_size


在这里插入图片描述
  此函数主要功能为返回string串可以存放的最大数据个数(数据为 “ char ”类型)。
在这里插入图片描述
  上图所展示为32位机器所能创建的最大数据个数。

5.4 resize


在这里插入图片描述
  此函数的主要功能为改变串的大小,不仅仅影响串的size,也可能会影响capacity。
  图中所示两种调用方法使用如下:

	string s1;
	s1.resize(10, 'Q');
	string s2("hello world,hello csdn,hello everyone");
	s2.resize(10);
	string s3;
	s3.resize(10);
	cout << "s1 = " << s1 << "; s1.size = " << s1.size() << endl;
	cout << "s2 = " << s2 << "; s2.size = " << s2.size() << endl;
	cout << "s3 = " << s3 << "; s3.size = " << s3.size() << endl;

在这里插入图片描述
  上图所示,resize会改变串的大小,当改变前串中所储存数据大小大于改变后大小时,仅保留改变后的前几位数据;
  当所传参数位 ( 数字 ,字符),resize会将串中的数据置换为所传的 n 个字符,并改变其串的大小,改变后大小为 n 。
  当只传递数字时,若原串没有数据,则将其串内数据赋默认值 ’ \0 '。

5.5 capacity


在这里插入图片描述
  返回当前串所占空间大小。
在这里插入图片描述

5.6 reserve


在这里插入图片描述
  此函数的主要功能为扩容,但在不同编译器下的操作限制有所不同,例如在VS下不可以反向扩容,即缩容,但在linux下可以。
在这里插入图片描述

5.7 clear


在这里插入图片描述
  此函数功能为清楚串内数据。
在这里插入图片描述

5.8 empty


在这里插入图片描述

  此函数功能为判断串是否为空串,是返回true,不是返回false。




6、结语


在这里插入图片描述

  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值