【STL】string的使用

这篇具有很好参考价值的文章主要介绍了【STL】string的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

放在专栏【C++知识总结】,会持续更新,期待支持🌹


STL简介

STL的诞生

STL为英文Standard Template Library的缩写,译为标准模板库是C++标准库的重要组成部分

  • 长久以来,软件届一直希望建立一种可重复运用的东西。所谓的泛型思想以及面向对象最主要的目的就是为了复用性的提升
  • 复用性需要建立在某种标准之上,而数据结构与算法却迟迟未能有一套标准,导致大量程序员被迫从事大量重复的工作
  • STL的出现实现了在数据结构与算法之间建立一套标准,并降低其耦合度。

STL具有多个版本:HP版本、P.J.版本、RW以及SGI版本,由于SGI版本在命名风格以及编程风格方面可读性更佳,所以后续一些学习都将参考该版本。

STL的组成部分

STL由六大组件构成,分别为:容器、算法、迭代器、仿函数、配接器、空间配置器。彼此之间可以组合套用。

【STL】string的使用

接下来,我们学习的就是关于string相关使用。

string类

string简介

在C语言中,有整形、字符类型、浮点型等,但是=并没有字符串类型。而对于字符串,C语言中通常都是使用字符指针或字符数组来存储。但是字符指针指向的是字符常量,不可被修改,而字符数组又面临数组越界等情况。并且也不符合面向对象的思想。C++针对于此,string诞生。

【STL】string的使用

如果我们仔细观察的话,就会发现,实际上string类是basic_string模板类使用char来实例化出来的一个类。对于basic_string模板类,这里不做过多介绍,有兴趣的可以搜寻相关文档。

 string的使用

(不要忘记包含头文件<string>

构造函数

string的构造函数有很多接口,没必要各个都掌握,否则学习起来会比较繁琐。(这也是C++被吐槽的原因之一,这么多接口,咋可能都记住)。我们只需要掌握其中一些即可,其余的可以翻阅文档。如下:

string提供的构造函数 功能说明
string() 构造空的string类对象,即空字符串
string(const char* str) 用C语言格式的字符串,来构造一个string类对象
string(size_t n,char c) 用n个字符,来构造一个string类对象
string(const string& str) 拷贝构造

具体使用如下

#include<iostream>
#include<string>//头文件
//using namespace std;//也可以直接展开命名空间,后面就不需要声明string属于std这个域了

int main()
{
	std::string s1;               //空字符串构造
	std::string s2("hello world");//用C格式字符串构造
	std::string s3(10, 'a');      //10个a字符,来构造一个string对象

	std::string s4(s3);           //拷贝构造

	std::cout << "s1: " << s1 << std::endl;
	std::cout << "s2: " << s2 << std::endl;
	std::cout << "s3: " << s3 << std::endl;
	std::cout << "s4: " << s4 << std::endl;

	return 0;
}

运行结果如下:

【STL】string的使用

 容量相关

string提供的有关容量的函数 功能说明
size 返回有效字符串的长度
length 与size相同,推荐使用size
capacity 空间总大小
empty 字符串是否为空,空返回true,非空返回false
clear 清空有效字符
reserve 进行扩容,改变的是总空间的大小,直接影响capacity
resize 对有效字符进行扩容,改变的是size的大小,可能会间接影响capacity

size与capacity

我们来看,size为有效字符的长度大小,capacity为总空间大小。两者并不相同。如下图:

【STL】string的使用

clear与empty就不用多说了,这里需要注意的是,clear只是将有效字符的第一个字符设置成\0,不会改变总空间的大小,但是会影响size,因为size计算的是有效字符串的长度,遇到\0结束。

【STL】string的使用

 reserve与resize

两者都是扩容,不同的是,reserve是改变总空间的大小,而resize改变的是有效字符的大小。如下:

【STL】string的使用

reserve进行空间扩容时,采用异地扩容 。

【STL】string的使用

可能有人也想我这么皮,用reserve缩容,看看会发生啥,如下:reserve不会进行缩容。 

【STL】string的使用

resize

【STL】string的使用

 resize则是将有效字符扩容成n个,如果不指定c,则默认用0来填充剩余空间,如果扩容后的有效字符超过了总空间的大小,则总空间会自动扩容。

【STL】string的使用

VS与Linux扩容策略对比

如果细心的话,就会发现,我们在VS中进行扩容时,一开始时数据存放在15大小的_buf数组中,后来在扩容超过该数组空间时,才又开辟额外空间。

【STL】string的使用

我们可以写如下代码来进行验证一下:

int main()
{
	string s;
	size_t sz = s.capacity();
	cout << "making s grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		s.push_back('c');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

【STL】string的使用

VS扩容策略

  1. 数据size小于15时,存放在buf数组中。
  2. 当数据大于15时,先2倍扩容,后续再进行扩容时以1.5倍进行扩容

Linux扩容策略

  1. 不存在buf数组,默认空间大小为0
  2. 从1开始,严格遵守2倍扩容

实际上VS的策略更加合理一些,因为实际中string的大小不会太大,给个15大小的数组,一般是够用的。而Linux频繁的扩容,会导致内存碎片问题,因此VS策略会更加合理一些。另外,我们在使用string时,如果能提前计算出所需要的空间,直接reserve提前扩容,会提高一定的运行效率。

string类对象的访问以及遍历

1.[]下标访问

由于string对[]进行重载,所以支持[]进行访问,就像数组下标一样。使用也很简单,如下:

【STL】string的使用

 2.迭代器

什么是迭代器?

首先我们来谈一谈迭代器是个啥东西,迭代器既然可以作为六大组件之一,那么一定有它的过人之处。我们先来看一下迭代器在书中《STL源码剖析》的定义:

【STL】string的使用

 【STL】string的使用

 简单来说,就是用一个对象,来模拟一个指针的行为,从而实现对各个容器中成员的访问

在string,或者vector(实际上就是一个数组)中,我们可以将它简单的想象成一个指针,指针++,表示访问下一个元素的地址,*解引用,表示访问该位置的成员。(当然,它并不是一个指针,因为像链表、树形结构中,各个元素之间的地址并不是紧密相连,后续遇到再仔细讲解,这里就简单理解为指针)。

回归正题,这里用迭代器进行成员访问,如下:

【STL】string的使用

 reverse_iterator为反向迭代器,顾名思义可以倒着访问,使用如下:

【STL】string的使用

当然,string还存在const_iterator与const_reverse_iterator。看名字也可以看出来,不可对成员进行修改。用法与上面一样。具体迭代器的细节将放在后面list章节再继续探讨。

3、范围for

范围for的底层实际上是迭代器,用法也很简单,在前面章节已经讲解过。

 【STL】string的使用

string类对象的修改操作

插入与删除

我们查阅官方文档,发现有大量的接口供我们使用,这里我就只讲某个函数的其中一个来讲解(实在是太多,不得不吐槽)

string支持的插入函数 功能含义
push_back 尾插字符
append 追加字符串
+= 追加字符串
insert 插入操作

这些接口都很简单,用法如下:

【STL】string的使用

 删除erase,用法也很简单,这里就不做过多演示。大家可以自己去试着玩一玩。

查找find

【STL】string的使用

 find默认从0下标开始,查找一个字符或者字符串,找到后返回该字符所在的下标。找不到返回npos。npos实际上就是-1,而size_t是无符号整形,所以这里的npos代表整形最大值。用法如下:

【STL】string的使用

 string提供的接口实在是太多了,大家自行可以去网站https://cplusplus.com/reference/查找。这里我就不做相关演示了。

string的模拟实现

为了能更好的理解底层的实现,我们可以参照STL中string的源码实现,来自己实现一个简单的string,从而加深对string的理解。源码可能会复杂难懂,推荐书籍《STL源码剖析》,里面会有一些关键标注。当然我们在实现时没必要面面俱到,实现大体即可。

以下链接内为我个人实现的一个简单string,内部含有个人注释,如有不解,可联系交谈:

string类的模拟实现练习 · ede63fa · 齐敦炎/C++学习所用仓库 - Gitee.com


end.

生活原本沉闷,但跑起来就会有风!🌹文章来源地址https://www.toymoban.com/news/detail-446249.html

到了这里,关于【STL】string的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++STL详解(一)一一string类介绍和使用

    一、string的定义方式 STL中string类实现了多个构造函数的重载,常用六个构造如下: 使用示例:使用前要包含string头文件 运行结果: **注意nops是一个无符号的-1转换成有符号是32个比特位全1大小实际是2^32次方约等于4个G,所以我们不可能定义那么长的字符串,所以len缺省值给

    2024年02月22日
    浏览(29)
  • 【STL】string类 (上)& <vector>和<list>的简单使用

    目录 一,什么是 STL  二,STL 的六大组件 三,标准库中的 string 类 1,string 类  2,string 类的常用接口 1,string类对象的常见构造 2,string(const string str) 3,string (const string str, size_t pos, size_t len = npos); 4,string (const char* s ) 5,string (const char* s,size_t n); 6,string (size_t

    2024年02月04日
    浏览(25)
  • 【C++】STL容器——string类的使用指南(含代码演示)(8)

    前言 大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《初学者易

    2024年02月08日
    浏览(33)
  • 【剖析STL】String

    标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(

    2024年02月04日
    浏览(28)
  • 【STL】string类 (下)

    目录 1,insert 2,erase 3,find 4,replace 5,rfind 6,substr 7,find_first_of 8,find_first_not_of 9,find_last_of 10,operator+ 11,getline 在 pos 位置之前插入字符串 擦除范围字符串 从 pos 位置开始,用 n 个字符替换; 上述可以看到,第一个替换从下标 0 开始用两个字符也就是 ” he “ 替换 “

    2024年02月05日
    浏览(56)
  • 【c++】STL--string

            最开始我们学习c语言的时候,我们发现刷题或者写代码都是比较麻烦的,如果说用c语言造一辆车,那么我需要用c语言先把轮子造好--各个零件,当我们造好之后再组装。那么c++则是造好了轮子,只需要我们组装就好了。这里的的STL里有各个组件,我只要熟悉的掌握

    2024年02月03日
    浏览(39)
  • 【STL】手撕 string类

    目录 1,string类框架 2,string(构造) 3,~string(析构) 4,swap(交换) 5,string(拷贝构造) 1,常规法 2,简便法 6,size (字符长度) 7,c_str(返回字符形式的指针) 8,iterator(迭代器) 9,operator=(赋值) 1,常规写法 2,简便法 10,operator[](取值) 11,reserve(空间容量

    2024年02月04日
    浏览(31)
  • STL string

    计算机中只能存储二进制,不能存储现实生活中的文字,于是需要对文字进行编码 输入文字时,计算机根据编码表,将文字转换为对应的二进制,输出文字时,计算机根据编码表,将二进制转换为对应的文字 ASCII 码就是为了可以在计算机中存储和显示英文信息 由于计算机的

    2024年02月12日
    浏览(29)
  • C++ STL string类

    目录 一.为什么学习string类 (1) C语言中的字符串 (2)标准库里面的string类 二. string类的常用接口说明 (1)string类对象的常见构造 (2)string类对象的容量操作 1.size(),length(). 2. capacity() 3.empty()  4.clear()  5.reserve()  6.resize() (3)string类对象的访问及遍历操作  1.operator[ pos

    2024年02月13日
    浏览(26)
  • <C++_STL> string

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

    2024年02月03日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包