7.学习STL中的string类:版本、组件、构造、操作及应用

目录

1. 什么是STL

2. STL的版本

3. STL的六大组件

1. 为什么学习string类?

1.1 C语言中的字符串

2. 标准库中的string类

2.1 string类(了解)

2.2 string类的常用接口说明

1. string类对象的常见构造

2. string类对象的容量操作

reserve

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

 1. for+operator[]

2.迭代器 iterator 

3.范围for

4. string类对象的修改操作

5. string类非成员函数


1. 什么是STL

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架

2. STL的版本

原始版本

Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意 运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使 用。 HP 版本--所有STL实现版本的始祖

P. J. 版本

由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低, 符号命名比较怪异。

RW版本

由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。

SGI版本

由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好, 可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码, 主要参考的就是这个版本。

3. STL的六大组件

今天我们主要要讲到string和reverse(逆置)

1. 为什么学习string类?

1.1 C语言中的字符串

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

2. 标准库中的string类

2.1 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 string;
  4. 不能操作多字节或者变长字符的序列。

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

2.2 string类的常用接口说明

(注意下面只讲解最常用的接口)

1. string类对象的常见构造

看一下string的一些实现

上面使用到了 传地址(开辟新空间接收)和 直接传字符串(会发现,其实是传的引用):

2. string类对象的容量操作

可以测试发现:

注意:clear清理的是size,capacity不变

reserve

通过查阅可以了解其性能 

【注意】

  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不会改变容量大小。

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

那么我们现在遍历字符串就有三种方法了:

 1. for+operator[]
for (size_t i = 0; i < s.size(); ++i)
            cout << s[i] << endl;
2.迭代器 iterator 
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;

4. string类对象的修改操作

一些实现和应用

void Teststring5()
{
	string str;
	str.push_back(' ');   // 在str后插入空格
	str.append("hello");  // 在str后追加一个字符"hello"
	str += 'b';           // 在str后追加一个字符'b'   
	str += "it";          // 在str后追加一个字符串"it"
	cout << str << endl;
	cout << str.c_str() << endl;   // 以C语言的方式打印字符串

	// 获取file的后缀
	string file("string.cpp");
	size_t pos = file.rfind('.');
	string suffix(file.substr(pos, file.size() - pos));
	cout << suffix << endl;

	// npos是string里面的一个静态成员变量
	// static const size_t npos = -1;

	// 取出url中的域名
	string url("http://www.cplusplus.com/reference/string/string/find/");
	cout << url << endl;
	size_t start = url.find("://");
	if (start == string::npos)
	{
		cout << "invalid url" << endl;
		return;
	}
	start += 3;
	size_t finish = url.find('/', start);
	string address = url.substr(start, finish - start);
	cout << address << endl;

	// 删除url的协议前缀
	pos = url.find("://");
	url.erase(0, pos + 3);
	cout << url << endl;
}

【注意】:

1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般 情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好

5. string类非成员函数

上面的几个接口大家可以了解一下,下面的OJ题目中会有一些体现他们的使用。string类中还有一些其他的 操作,这里不一一列举,大家在需要用到时不明白了查文档即可~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/628092.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百面算法工程师 | python解释器基础问答

本文给大家带来的百面算法工程师是深度学习python解释器面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的python用法&#xff0c;并提供参考的回答及其理论基础&…

【Flask框架】

6.Flask轻量型框架 6.1Flask简介 python提供的框架中已经写好了一个内置的服务器&#xff0c;服务器中的回应response行和头已经写好&#xff0c;我们只需要自己写显示在客户端&#xff0c;的主体body部分。 ---------------------------------------------------------- Fla…

OpenAI新模型GPT-4o“炸裂登场” 响应速度堪比真人 关键还免费!

GPT-4o模型基于来自互联网的大量数据进行训练&#xff0c;更擅长处理文本和音频&#xff0c;并且支持50种语言。更值得一提的是&#xff0c;GPT-4o最快可以在232毫秒的时间内响应音频输入&#xff0c;几乎达到了人类的响应水平。 GPT-4o有多“炸裂”&#xff1f;核心能力有三 G…

Web前端学习路线

本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。整理了一份关于前端学习的指南&#xff0c;希望对大家有所帮助。 为什么需要学习前端&#xff1f; 本文讲的前端是指Web开发前端&#xff0c;不包括Android、iOS、小程序等移动端开发。 当前的浏览…

【面试必看】MySQL部分

MySQL 1. 基础 1. 什么是关系型数据库&#xff1f; 一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多&#xff09;。各种表中&#xff08;比如用户表&#xff09;&#xff0c;表中的每一行就存放着一条…

工具:资源包提取

1.提取unity资源包的工具 一定要通过文件夹的方式选择unity文件否则导出来后的资源不完整

python:merge的用法

目录 1.merge基本语法 2.参数说明 3.示例 在Python的Pandas库中&#xff0c;merge函数是一种常用的工具&#xff0c;用于根据一个或多个键将两个或多个DataFrame对象合并在一起。以下是merge函数的基本用法和参数解释&#xff1a; 1.merge基本语法 pd.merge(left, right, …

BFS和DFS优先搜索算法

1. BFS与DFS 1.1 BFS DFS即Depth First Search&#xff0c;深度优先搜索。它是一种图遍历算法&#xff0c;它从一个起始点开始&#xff0c;逐层扩展搜索范围&#xff0c;直到找到目标节点为止。 这种算法通常用于解决“最短路径”问题&#xff0c;比如在迷宫中找到从起点到终…

Char类型、转义及字符集:Java中的字符串奥秘

在Java的8中基本数据类型中&#xff0c;char类型是较难掌握&#xff0c;处理char类型本身的用法之外&#xff0c;还要理解其与字符串的关系、转义序列、字符集。 本文将从基础概念出发&#xff0c;逐步深入探讨这些主题&#xff0c;并通过实例演示来巩固理解。 一、Char类型&…

【leetcode面试经典150题】-27. 移除元素

88.合并两个有序数组 1 题目介绍1 个人解题思路1.1 解题代码1.2 思路解析 2、分析官方题解2.1 单侧双指针2.2 双侧双指针 1 题目介绍 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外…

C++自定义脚本文件执行

FunctionCall.h&#xff1a; #include <sstream> #include <string> #include <vector> // 函数调用 class FunctionCall { public: FunctionCall(); ~FunctionCall(); std::string call(const st…

天锐绿盾和bitlocker有啥区别?

#绿盾文档加密系统# 天锐绿盾和BitLocker是两种不同的数据加密解决方案&#xff0c;它们各自有不同的重点和应用场景&#xff0c;以下是它们之间的主要区别&#xff1a; PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 移动…

每日一题:最大加号标志

在一个 n x n 的矩阵 grid 中&#xff0c;除了在数组 mines 中给出的元素为 0&#xff0c;其他每个元素都为 1。mines[i] [xi, yi]表示 grid[xi][yi] 0 返回 grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志&#xff0c;则返回 0 。 一个 k 阶由 1 组…

永磁同步电机的脉振高频注入无速度传感器simulink仿真模型

整理了永磁同步电机的脉振高频注入无速度传感器simulink仿真模型&#xff0c;该模型高频注入仿真pmsm&#xff0c;无感控制&#xff0c;解决0速转矩输出问题&#xff0c;插入式永磁同步电机&#xff0c;凸极&#xff0c;高频注入。MATLAB/simulink仿真&#xff0c;适合研究学习…

深度学习面试问题 | 降维

本文给大家带来的百面算法工程师是深度学习降维面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习面试问题&#xff0c;并提供参考的回答及其理论基础&#…

No Cortex-M SW Device Found

将DIO和CLK管脚调换一下

【制作100个unity游戏之26】unity2d横版卷轴动作类游戏4(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言添加敌人受击动画第一种 配置闪烁动画第二种 受伤击退效果人物死亡源码完结 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第26篇中&#xff0c;我们将…

一文读懂:低代码

引言 在数字化转型的时代&#xff0c;软件开发已经成为企业迅速响应市场需求和创新的关键。然而&#xff0c;传统的软件开发模式往往面临着繁琐的代码编写、长周期的开发时间以及对技术专业知识的依赖&#xff0c;这使得许多企业在追求创新和业务扩展的过程中倍感束手无策。 …

dragonbones 5.6.3不能导出的解决办法

问题描述 使用dragonbones 5.6.3导出资源时无反应。 解决方法 第一步安装node.js&#xff0c;我这里使用的是V18.16.0第二步进入到DragonBonesPro\egretlauncher\server\win目录&#xff0c;然后把里面的node.exe替换为刚刚下载的node文件夹即可&#xff0c;如下图&#xff…

Synchronize 底层实现原理

1 、加锁实现原理 public class SynchronizedTest {public void get(){synchronized (this){ // 这个是同步代码块System.out.println("你好呀");}}public synchronized void f(){ //这个是同步方法System.out.println("Hello world");}public s…