【C++】STL容器之string(一)

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 一、初识
  • 二、概述
  • 三、string类的常见接口
    • 1.默认成员函数
      • (1)构造函数
      • (2)析构函数
      • (3)赋值重载函数
    • 2.容量相关函数
      • (1)size、length、capacity
      • (2)max_size
      • (3)clear和empty
      • (4) reserve
      • (5) resize

前言:

在C语言中,string是一种字符串你类型,在C++中,我们充分利用OOP特性,让我们一起来学习STL中的string类吧!

一、初识

  • string意为字符串,那回忆一下我们在C语言阶段所学习的字符串,是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些string系列的库函数。但是这些库函数与字符串是分离开的,不太符合 OOP 的思想,而且底层空间需要用户自己管理,十分不方便。

因此,在C++中专门搞出了一个与字符串相关的类,我们知道C++是面向对象的,我们可以在类内去写各种成员函数来对外提供操作字符串的接口,这个类就是string类

下图是STL容器中的内容:
在这里插入图片描述

你会发现在C++的容器里面并没有string。

  • 其实,string的历史比较久远,在C++的容器里面并没有string,因为它是在STL之前就已经存在了的,属于C++标准库里的内容。

二、概述

查询C++网站,如下:

在这里插入图片描述

  • string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;

  • string是表示字符串的字符串类

  • 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。

  • 不能操作多字节或者变长字符的序列。

  • 在使用string类时,必须包含#include< string >头文件,并使用std::包含。

三、string类的常见接口

1.默认成员函数

函数名称功能说明
constructor构造函数
destructor析构函数
operator=赋值重载

(1)构造函数

构造函数一共有7个重载,其中1,2,3比较常用。

1.string();		// 构造一个空字符串
2.string (const char* s);				// 用C-string来构造string类对象
3.string (const string& str);		// 利用原先的字符串做拷贝构造
4.string (const char* s, size_t n);	// 用C-string的前n个字符来构造string类对象
5.sring (size_t n, char c);		// 生成n个c字符的字符串
// 拷贝str字符串中从pos位置开始的len个字符
6.string (const string& str, size_t pos, size_t len = npos);	

将上面六种构造函数演示一下!

在这里插入图片描述

通过这个实例很清楚搞明白了,其中第三个就是【拷贝构造】,但是第6个中的npos的意思你可能不知道代表什么~

6.string (const string& str, size_t pos, size_t len = npos)
  • npos: 无符号整数的最大值
  • pos:指定下表位置

(2)析构函数

在这里插入图片描述

析构函数一般默认调用

~String();

(3)赋值重载函数

在这里插入图片描述

整理一下也就是下面3种类型:

string& operator= (const string& str);	// 将一个string对象赋值给到另一个
string& operator= (const char* s);		// 将一个字符串赋值给到string对象
string& operator= (char c);				// 将一个字符赋值给到string对象

实例运行一下-
在这里插入图片描述

2.容量相关函数

一共有下面这几种

函数名称功能说明
size返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
maxsize返回字符串的最大长度
clear清空有效字符
empty检测字符串释放为空串,是返回true,否则返回false
reverse为字符串预留空间
resize将有效字符的个数该成n个,多出的空间用字符c填充
shrink_to_fit收缩到合适大小

(1)size、length、capacity

在这里插入图片描述

在这里插入图片描述
比较上面两幅图,对于size和length,他们的返回结果都是返回当前字符串中存放了多少字符,\0结束。但是在C++中,我们通常使用【size】即可,因为其他STL库中的接口使用的也是【size】。
而capacity:表示当前这个字符串可容纳的空间数。
在这里插入图片描述

总结:

  • 1.lenght和size,通常使用size。
  • 2.size:表示当前字符串中存放了多少字符。
  • 3.capacity:表示当前这个字符串可容纳的空间数。
  • 4.string的扩容机制:在Windows下的VS中,扩容的大小是呈现一个1.5倍大小的趋势,而且在vs编译器中,它的初始大小是15,超过15个字符后开始1.5倍扩容;可是在Linux平台下呈现的却是2倍大小的趋势

(2)max_size

在这里插入图片描述
这个函数的作用就是返回字符串能达到的最大长度。
在这里插入图片描述

  • vs中是2147483674.

(3)clear和empty

在这里插入图片描述
实例运行一下:
在这里插入图片描述

  • 通过上面两幅图,可以得出:
    clear:擦除字符串的内容,使其成为空字符串(长度为0个字符)。并不会去清空这个【capacity】容量的大小。

在这里插入图片描述
实例运行一下:
在这里插入图片描述

empty:返回字符串是否为空,(即其长度是否为0)。
没被清空的时候返回0,代表false不空; 而被清空之后返回1,代表true为空

(4) reserve

这个reserve就相对复杂一些了,然我们一起慢慢学习~

  • 首先,reserve简单来说可以提前为一个字符串开出指定大小的空间。

在这里插入图片描述

  • 但是,它并不一定开辟出指定大小的空间,可能大可能小【 non-binding】,如上图文档所说。

实例运行:在windows的vs2019下发现确实是这样。
在这里插入图片描述

  • 总结来说:在Windows下,实际给的容量与你指定的可能会不相符。但是,在Linux下实际给容量的等于你指定的大小。

(5) resize

在这里插入图片描述

  • 简单来说,resize:将字符串大小调整为n个字符的长度。

实例运行:
在这里插入图片描述

  • 可以发现,reserve只是扩充了容量,但是里面并没有填充字符。resize是不但扩充了容量,并且填充指定数量的字符,默认是‘\0’而且同样遵循在WindowsLinux的指定扩充大小与实际不符的请情况。

resize还有一个特别的地方:

  • 1️⃣ 如果 n > 当前的字符串长度,则在末尾插入所需数量的字符【通常默认是‘\0’,也可以指定字符】以达到n的大小来扩展当前内容
    🔸指定填充字符的函数void resize (size_t n, char c);char c:就是要指定的字符。

  • 2️⃣ 如果n < 当前的字符串长度,则会去进行一个删除的操作,删除第n个字符之后的字符,产生截断

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入漏洞解析--less-2

首先我们进入第二关 思路&#xff1a; 1.先判断是什么类型的注入 2.根据类型我们在找注入点 步骤&#xff1a; 1.提示我们输入id数字&#xff0c;那我们先输入1猜一下 2.这里正常回显&#xff0c;当我们后边加上时可以看到报错&#xff0c;且报错信息看不到数字&#xff0…

五、使用脚手架

五、使用脚手架 5.1 简单的实现 创建一个 School 组件 <template> <div><h2>学校名称&#xff1a;{{name}}</h2><h2>学校地址&#xff1a;{{address}}</h2> </div> </template><script> export default {name: "S…

想高薪就业鸿蒙HarmonyOS 开发岗位,到底该学习些啥?

鸿蒙是什么&#xff1f; 经过十多年的发展&#xff0c;传统移动互联网的增长红利已渐见顶。万物互联时代正在开启&#xff0c;应用的设备底座将从几十亿手机扩展到数百亿 IoT 设备。GSMA 预测到 2025 年&#xff0c;全球物联网终端连接数量将达 246 亿个&#xff0c;其中消费物…

CSP-J 2023 T3 一元二次方程

文章目录 题目题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题目传送门题解思路总代码 提交结果尾声 题目 题目背景 众所周知&#xff0c;对一元二次方程 a x 2 b x c 0 , ( a ≠ 0 ) ax ^ 2 bx c 0, (a \neq 0) ax2bxc0,(a0)&#xff0c;可…

React 事件处理 ( this问题 参数传递 ref)

React事件的命名采用小驼峰方式&#xff08;cameCase&#xff09;,而不是小写 使用JSX语法时你需要传入一个函数作为事件处理函数&#xff0c;而不是一个字符串 你不能通过返回false 的方式阻止默认行为。你必须显示式的使用preventDefault 1 this 需要谨慎对待JSX回调函数中的…

HubSpot数据驱动的网站优化策略

当涉及到HubSpot数据驱动的网站优化策略时&#xff0c;下面是一些具体且详细的描述&#xff1a; 1. 数据收集与分析&#xff1a; HubSpot提供了一系列数据收集和分析工具&#xff0c;让客户能够深入了解外贸网站的表现。这些工具包括网站分析、访客追踪、转化追踪等。客户可以…

【刷题】牛客 JZ64 求1+2+3+...+n

刷题 题目描述思路一 &#xff08;暴力递归版&#xff09;思路二 &#xff08;妙用内存版&#xff09;思路三 &#xff08;快速乘法版&#xff09;思路四 &#xff08;构造巧解版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01…

【SiamFC】《Fully-Convolutional Siamese Networks for Object Tracking》

ECCV 2016 Workshops 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 The OTB-13 benchmark5.3 The VOT benchmarks5.4 Dataset size 6 Conclusion&#xff08;own&#xff09;/ Future wo…

学习总结22

解题思路 简单模拟。 代码 #include <bits/stdc.h> using namespace std; long long g[2000000]; long long n; int main() {long long x,y,z,sum0,k0;scanf("%lld",&n);for(x1;x<n;x)scanf("%lld",&g[x]);for(x1;x<n;x){scanf(&qu…

如何切换到Ubuntu系统上来

上篇讲到,使用Ubuntu系统能让人带来积极的影响,那么如何使用上这个系统呢?其实很多时候,不是不会安装的技术问题,而是意愿或者心理障碍的问题。 以下是我使用ubuntu系统一年半的经验,相信经过这三部分的介绍,可以帮助你了解linux系统的最新进展,克服使用困难,使用上U…

SpringCloud全家桶---常用微服务组件(1)

注册中心: *作用: 服务管理 Eureka(不推荐)[读音: 优瑞卡] Nacos(推荐) Zookeeper [读音: 如k波] Consul [读音:康寿] **注册中心的核心功能原理(nacos)** 服务注册: 当服务启动时,会通过rest接口请求的方式向Nacos注册自己的服务 服务心跳: NacosClient 会维护一个定时心跳持…

基于SpringBoot的教师宿舍管理系统设计与实现(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的教师宿…