【C++】07.string详解

发布于:2024-05-09 ⋅ 阅读:(30) ⋅ 点赞:(0)

目录

一、为什么会有string?

二、string的常见接口说明

2.1 string的默认成员函数

2.1.1 默认构造函数

2.1.2析构函数

2.1.3赋值运算符

2.2迭代器介绍       

2.2.1 正向迭代器

2.2.2 反向迭代器

2.3 string类对象的容量操作

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

2.4.1 operate[ ]        

2.4.2 begin + end

2.4.3 rbegin + rend

2.4.4 范围for循环

2.5 string类对象的修改操作

2.6 string类对象的其他接口


一、为什么会有string?

        在C语言中,字符串是以 '\0' 结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在这种情况下,C++引入了string类来满足OOP。

二、string的常见接口说明

        本篇博客以string - C++ Reference为纲领对string类进行说明。        

2.1 string的默认成员函数

2.1.1 默认构造函数

        常用的构造函数如下:

                            

        上述第一个是实例化一个空的字符串,里面中有0个字符;

                第二个是用另一个字符串拷贝构造新的字符串;

                第三个是用使用s来构造新的字符串。


        不常用但需要了解的函数如下:       

              

        在讲解第三个函数之前,需要了解一下 npos,查阅文档可知:

static const size_t npos = -1;//无符号整型的-1,即最大值

        好,现在可以解释上述的函数了:

        上述第一个函数表示用 str中从pos开始的npos个字符 来构造string,当没有传递npos时,就默认到达末尾的位置(当npos的值大于str长度时也是拷贝到末尾);

               第二个函数表示拷贝s的前n个字符来构造string;

               第三个函数表示用n个c字符来构造string;

                第四个就交由读者自行了解。

2.1.2析构函数

        一般来说析构函数不需要实现,了解即可。

        

2.1.3赋值运算符

        赋值运算符如下:

                       

        上面的函数表明了可以使用 str,s,c来为string赋值。了解之后,直接拿来使用即可

2.2迭代器介绍       

        常用的迭代器如下:

       

2.2.1 正向迭代器

              

        begin返回的是任意容器的第一个数据的iterator,end返回的是任意容器的最后一个数据的itrator。可以顺序遍历string。

        而这两个函数都有两个函数声明:iterator  可读可写;const_iterator 只可读,保证元素不能被修改。

2.2.2 反向迭代器

         

        rbegin返回的是任意容器的最后一个数据的iterator,rend返回的是任意容器的第一个数据的前一个位置的itrator。对string进行逆序遍历。

        这两个函数也有两个函数声明:原则同上。

2.3 string类对象的容量操作

        最常见的操作如下:             

        对于size和length两个函数均是用来返回字符串长度的,size是为了与STL相符而优化来的;

                resize是用来将有效字符的个数该成n个,多出的空间用字符c填充(省略不写的话,默认补'\0'),若减少的话,则表示删除;

                capacity返回字符串的当前空间总大小;

                reserve表示为当前字符串预留n个字符的空间;

                clear用来清空有效字符;

                empty用来判断当前是否为空串,是返回true,否则返回false。

        此函数是用来使容量和大小相适应的,但不建议使用,因为释放内存空间时不能分段释放,因此这个函数会优先申请一块合适的空间来存放数据,但是时间消耗较大。

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

        对于string的遍历有4种方式,接下来将一一介绍:

2.4.1 operate[ ]        

        字符串实质上也是对字符数组的封装,因此也可重载[ ]来支持字符串的遍历。

2.4.2 begin + end

        这两个迭代器实现了string类对象的正向遍历。

2.4.3 rbegin + rend

        这两个迭代器实现了string类对象的反向遍历。

2.4.4 范围for循环

        范围for是C++11引入的操作,他大大的方便了我们对数组等的遍历。

具体的代码实现:

void Teststring()
{
	string s("hello Bit");
	// 3种遍历方式:
	// 需要注意的以下三种方式除了遍历string对象,还可以遍历是修改string中的字符,
	// 另外以下三种方式对于string而言,第一种使用最多
	// 1. for+operator[]
	for (size_t i = 0; i < s.size(); ++i)
		cout << s[i] << endl;

	// 2.迭代器
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << endl;
		++it;
	}

	// string::reverse_iterator rit = s.rbegin();
	// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型
	auto rit = s.rbegin();
	while (rit != s.rend())
		cout << *rit << endl;

	// 3.范围for
	for (auto ch : s)
		cout << ch << endl;
}

2.5 string类对象的修改操作

        对类对象的插入操作:

        但最常用的是+=运算符,剩下的两个稍微了解就好。        

        若是对首元素或者中间元素的插入和删除操作,时间复杂度为O(N),时间消耗很大,不是特别建议使用,了解常用接口即可。

2.6 string类对象的其他接口

        查看了解使用即可。

        该函数用来截取从pos位置开始的数据,默认到结束位置为止。

        该函数用来将C++的字符串转化为C语言的字符数组。


网站公告

今日签到

点亮在社区的每一天
去签到