当前位置: 首页 > news >正文

【C++】string类的使用②(容量接口Capacity || 元素获取Element access)

在这里插入图片描述

🔥个人主页: Forcible Bug Maker
🔥专栏: STL || C++

目录

  • 前言
  • 🔥容量接口(Capacity)
    • ==size和length==
    • ==capacity==
    • ==max_size==
    • ==reserve==
    • ==resize==
    • ==clear==
    • ==empty==
    • ==shrink_to_fit==
  • 🔥元素获取(Element access)
    • ==operator[ ]==
    • ==at==
    • ==back和front==
  • 结语

前言

本篇博客主要内容:STL库中string的容量接口(Capacity)和四种元素获取方式(Element access)的介绍和使用

来到string类的使用第二篇,让我们接着上一篇来讲。

🔥容量接口(Capacity)

在这里插入图片描述

size和length

在这里插入图片描述
在这里插入图片描述
size_t size() const;
size_t length() const;
将这两个函数接口的功能完全相同,它们没有参数传递,只有一个返回值(且这个返回值是const类型,不能被改变),返回:string对象中串的长度

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("Test string");// string::sizecout << "字符串长度为" << str.size() << endl;// string::lengthcout << "字符串长度为" << str.length() << endl;return 0;
}

在这里插入图片描述
至于为什么设计了两个功能相同的函数,这就牵扯到STL的发展史了。string是STL库中最早被实现的内容之一,当时获取字符串长度的时候只有length,并没有size。但随着STL的发展,陆续出现了vector,list,stack,queue这样的容器,在获取他们的元素个数时,使用的接口函数名用length(长度)似乎不太合适,于是选用了size(大小),string为了和别的容器保持一致,不得已也给自己加了一个size上去。

capacity

在这里插入图片描述
size_t capacity() const;
返回值:当前string对象中给串分配的字节数

这个分配的容量不一定和string的长度(length)相等,它可以等于或大于length的大小,它额外的空间可以优化对象往串中增加字符时的操作。如果string的容量(capacity)和串的长度(length)相等的话,那么当你向string对象的串中增加字符时,会导致每次的增加操作都会重新让存储串的空间扩一次容。

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("Test string");cout << "size: " << str.size() << "\n";cout << "length: " << str.length() << "\n";cout << "capacity: " << str.capacity() << "\n";return 0;
}

在这里插入图片描述
如果看过我之前数据结构部分的内容,其实就不难理解capacity和length之间的区别。
可以看看我之前数据结构的这篇:初阶数据结构—顺序表和链表(C语言),里面capacity和size的道理和这里相同。

max_size

在这里插入图片描述
size_t max_size() const;
返回值:string可以开辟的最大长度

使用案例:

// comparing size, length, capacity and max_size
#include <iostream>
#include <string>
using namespace std;
int main()
{string str("Test string");cout << "size: " << str.size() << "\n";cout << "length: " << str.length() << "\n";cout << "capacity: " << str.capacity() << "\n";cout << "max_size: " << str.max_size() << "\n";return 0;
}

在这里插入图片描述
你可能会感叹,string竟然可以开这么大。可max_size的大小简单计算一下,已经有两个G了。计算机其实开不了这么大,其中涉及到很多别的因素。而且在coding中基本上也想不到用这个,所以此函数实际没什么作用。

reserve

在这里插入图片描述
void reserve (size_t n = 0);
这是改变string对象capacity大小的一个命令,能将capacity的大小改变使其大于等于n

如果n比当前对象的capacity大,则这个函数会将string对象扩容至大于等于n。
当n小于capacity时,这个行为是为被C++标准定义的,具体行为取决于编译器:

  1. 一种编译器(如VS),会选择无视这条命令,cpacity保持原来的大小。
  2. 另一种编译器(Linux下的g++),比较听话,会将string对象缩容使capacity等于n。

这个接口函数不会改变string串中的内容和length的大小

无返回值

使用样例:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{string str("hello world");cout << str.length() << endl;cout << str.capacity() << endl;cout << endl;str.reserve(100);cout << str.length() << endl;cout << str.capacity() << endl;return 0;
}

在这里插入图片描述

resize

在这里插入图片描述
void resize (size_t n);
void resize (size_t n, char c);
将string对象的length改变为n

如果n小于当前string对象的length,那么string对象的串将被缩短,超出n部分的内容会被移除。
如果n大于当前string对象的length,如果没有提供第二个参数c,阔出来的新内容将会被'\0'填充;否则会被第二个参数“字符c”填充。

当n大于capacity的时候,string对象也会被扩容,使capacity增加至大于等于n

无返回值

使用样例:

// resizing string
#include <iostream>
#include <string>
using namespace std;
int main()
{string str("hello world");cout << str << endl;size_t sz = str.length();str.resize(sz + 4, 'x');cout << str << endl;// '\0'表示空,不会被打印str.resize(sz + 5);cout << str << endl;str.resize(sz);cout << str << endl;return 0;
}

在这里插入图片描述

clear

在这里插入图片描述
void clear();
将string串中的内容都删除,使其变成空串(length变成0),但容量capacity不会改变

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("hello world");cout << str << endl;cout << "str.size():" << str.size() << endl;cout << "str.capacity():" << str.capacity() << endl;str.clear();cout << str << endl;cout << "str.size():" << str.size() << endl;cout << "str.capacity():" << str.capacity() << endl;return 0;
}

在这里插入图片描述

empty

在这里插入图片描述
bool empty() const
返回值:string串的长度(length)是否为0,如果为零,返回真(true,1),如果不为零,返回假(false,0)

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str1("hello world");string str2;cout << "str1.length():" << str1.length() << endl;cout << "str2.length():" << str2.length() << endl;cout << endl;cout << "str1.empty():" << str1.empty() << endl;cout << "str2.empty():" << str2.empty() << endl;return 0;
}

在这里插入图片描述

shrink_to_fit

在这里插入图片描述
void shrink_to_fit();
C++11新增接口。
此接口函数的作用是缩容,但是其具体怎么实现,其实也是C++未定义的。其作用和reserve,n小于capacity时的情况差不多,不同编译器会有不同的解释和实现。

注:缩容对编译器来说开销一般都不小,所以非必要情况少使用缩容。

🔥元素获取(Element access)

在这里插入图片描述

operator[ ]

在这里插入图片描述
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
学过类和对象操作符重载的都知道,这里是一个[ ]的操作符重载,可以通过 方括号[ ]+下标获取串中的元素的引用

注:同时重载了const版本的方括号[ ]访问,当string对象为const类型时,下标获取的元素只能读,不能改。

代码样例和at放一起了。

at

在这里插入图片描述
char& at (size_t pos);
const char& at (size_t pos) const;
at的功能和operator[ ]相同,都是通过下标访问串中的元素。当string对象为非const类型时,也可以使用此访问对串进行内容上的改动。

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{// operator[]string str("Test string");str[1] = 'T';for (int i = 0; i < str.length(); ++i){cout << str[i] << " ";}cout << endl;// atstr.at(2) = 'T';for (int i = 0; i < str.length(); ++i){cout << str.at(i) << " ";}cout << endl;return 0;
}

在这里插入图片描述

注:at和operator[ ]也有区别,当下标pos越界时,使用at访问程序会抛异常,能被try…catch捕获;而用operator[ ]访问则会直接报错

back和front

C++11新增语法。
在这里插入图片描述
char& back();
const char& back() const;
返回string对象串的末尾元素的引用

非const类型的string对象可以通过此函数更改串元素内容。

在这里插入图片描述
char& front();
const char& front() const;
返回string对象串的首元素的引用

非const类型的string对象可以通过此函数更改串元素内容。

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("test string");str.front() = 'T';str.back() = 'G';cout << str << endl;return 0;
}

在这里插入图片描述

结语

本篇博客,介绍了9个容量接口(Capacity),它们有查询string串长度和更改长度的(size,length,resize),也有查询容量和更改容量的(capacity,reserve),和清理的(clear)。同时也讲到了种访问string对象串中元素的四种方式(operator[ ],at,front和back)。以上所提到各种接口和方法能让我们更加方便的操控string对象中的容量和内容,在熟练它们之后,就可以尽量避免使用那烦人的静态字符数组了
博主会继续分享关于string类的使用以及STL更多的内容,感谢大家的支持。♥

相关文章:

【C++】string类的使用②(容量接口Capacity || 元素获取Element access)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f525;容量接口&#xff08;Capacity&#xff09;size和lengthcapacitymax_sizereserveresizeclearemptyshrink_to_fit &#x1f525;元素获取&#xff08;Ele…...

【漏洞复现】某小日子太阳能系统DataCube3审计

漏洞描述 某小日子太阳能系统DataCube3终端测量系统 多个漏洞利用方式 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进…...

探索Java的未来

目录 一、云计算与大数据 二、人工智能与机器学习 三、物联网与边缘计算 四、安全性与性能优化 五、社区与生态 Java&#xff0c;作为一种广泛使用的编程语言&#xff0c;自其诞生以来就以其跨平台性、面向对象特性和丰富的库资源赢得了开发者的青睐。然而&#xff0c;随着…...

Web3 ETF软件开发

开发Web3 ETF软件涉及到金融、法律和技术等多个领域的专业知识&#xff0c;因此存在以下技术难点&#xff0c;开发Web3 ETF软件是一项复杂的技术挑战&#xff0c;需要综合考虑各种因素。开发人员需要具备较强的技术能力和跨学科知识才能成功开发Web3 ETF软件。北京木奇移动技术…...

初始MySQL

初始化MySQL数据库通常涉及以下步骤&#xff1a; 下载并安装MySQL&#xff1a; 你可以从MySQL官方网站下载适合你的操作系统的MySQL安装包。安装时&#xff0c;遵循安装向导的步骤&#xff0c;通常包括选择安装位置、选择组件&#xff08;例如MySQL服务器、MySQL Workbench等&a…...

STM32项目下载清单(不定时更新)

收集的一些资料&#xff0c;分享下载 电赛一等奖作品&#xff0c;老人健康监测智能手表&#xff08;STM32F4主控&#xff09; STM32数字示波器源码数字信号处理教程、配套实例基于stm32 nucleo_L476的智能灯&#xff08;操作说明源码&#xff09;基于STM32 NUCLEO板设计彩色LE…...

thinkphp5 配合阿里直播实现直播功能流程

要为你提供一个更详细的教程来结合ThinkPHP 5和阿里直播SDK实现直播功能&#xff0c;需要涵盖的内容相对较多。不过&#xff0c;我可以为你提供一个大致的、更详细的步骤指南&#xff0c;供你参考和扩展&#xff1a; 1. 准备工作 a. 注册阿里云账号 前往阿里云官网注册账号&…...

安卓手机APP开发__媒体3格式转换器__常见问题解答

安卓手机APP开发__媒体3格式转换器__常见问题解答 目录 1 为什么在示例的APP中我不能读取到本地的文件&#xff1f; 2 在一个特定的设备为什么导出失败&#xff1f; 3 媒体3格式转换器支持转码&#xff08;或者是录制&#xff09;远程的媒体吗&#xff1f; 4 媒体3格式转换…...

leetcode-有重复数字的全排列-98

题目要求 思路 1.同【没有重复项的全排列-97】这个题一样&#xff0c;都是递归的题&#xff0c;区别在于这个可能会包含重复的数字&#xff0c;因此&#xff0c;不能只是简单的通过两个值是否相等然后用标志位标记&#xff0c;而是新增了一个数组&#xff0c;这个数组专门用于…...

Unity数据持久化之XML

目录 数据持久化XML概述XML文件格式XML基本语法XML属性 C#读取存储XMLXML文件存放位置C#读取XML文件C#存储XML文件 实践小项目必备知识点XML序列化&#xff08;不支持字典&#xff09;XML反序列化IXmlSerializable接口让Dictionary支持序列化反序列化 数据持久化XML概述 什么是…...

Leetcode 226:翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 思路&#xff1a;使用递归 //使用前序遍历翻转树public static TreeNode invertTree(TreeNode root){if(rootnull) return root;swap(root);invertTree(root.left);invertTree(root.rig…...

柯里化与无参装饰器

柯里化 柯里化的概念&#xff1a;柯里化&#xff08;Currying&#xff09;在Python中是一种编程技术&#xff0c;它将原本接受多个参数的函数转换为一系列接受单个参数的函数。这种方法以逻辑学家Haskell Curry的名字命名。 简而言之就是将一次函数调用变成先放入一个参数得到…...

Spring事务失效的场景

1. 事务方法执行期间出现了异常&#xff0c;但是并未指定rollbackFor: Spring默认只会在遇到error和RunTimeException时才会回滚。 public boolean rollbackon ( Throwable ex){return (ex instanceof RuntimeException || ex instanceof Error); } 2. 事务方法执行期间出现了…...

Python基础学习之datetime模块

在Python编程中&#xff0c;处理日期和时间是一个常见的需求。Python的datetime模块提供了丰富的类和方法&#xff0c;用于表示和操作日期、时间、时间间隔等。本文将详细介绍Python的datetime模块&#xff0c;并给出一些实用的示例。 1. datetime模块概览 datetime模块是Pyt…...

在AI大模型中全精度和半精度参数是什么意思?

环境&#xff1a; 大模型中 问题描述&#xff1a; 在AI大模型中全精度和半精度参数是什么意思&#xff1f; 解决方案&#xff1a; 在深度学习和高性能计算领域&#xff0c;"全精度"和"半精度"通常指的是模型中使用的数值表示的精度&#xff0c;具体涉…...

刷题记录2

文章目录 刷题记录21047.删除字符串中的所有相邻重复项150.逆波兰表达式求值239.滑动窗口最大值347.前k个高频元素144.二叉树前序遍历(145、94后序、中序)102.二叉树的层序遍历226.翻转二叉树101.对称二叉树104.二叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 …...

【配置】Docker搭建JSON在线解析网站

一个python朋友需要&#xff0c;顺便做一下笔记 正常用菜鸟的就够了&#xff0c;点下面 JSON在线解析 云服务器打开端口8787 连接上docker运行 docker run -id --name jsonhero -p 8787:8787 -e SESSION_SECRETabc123 henryclw/jsonhero-webhttp://ip:8787访问 Github&…...

2024.5.2 —— LeetCode 高频题复盘

目录 151. 反转字符串中的单词129. 求根节点到叶节点数字之和104. 二叉树的最大深度101. 对称二叉树110. 平衡二叉树144. 二叉树的前序遍历543. 二叉树的直径48. 旋转图像98. 验证二叉搜索树39. 组合总和 151. 反转字符串中的单词 题目链接 class Solution:def reverseWords(s…...

ThreeJS:光线投射与3D场景交互

光线投射Raycaster 光线投射详细介绍可参考&#xff1a;https://en.wikipedia.org/wiki/Ray_casting&#xff0c; ThreeJS中&#xff0c;提供了Raycaster类&#xff0c;用于进行鼠标拾取&#xff0c;即&#xff1a;当三维场景中鼠标移动时&#xff0c;利用光线投射&#xff0c;…...

docker挂载数据卷-以nginx为例

目录 一、什么是数据卷 二、数据卷的作用 三、如何挂载数据卷 1、创建nginx容器挂载数据卷 2、查看数据卷 3、查看数据卷详情 4、尝试在宿主机修改数据卷 5、查看容器内对应的数据卷目录 6、 访问nginx查看效果 ​​​​​​​一、什么是数据卷 挂载数据卷本质上就是实…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

使用 ROS1-Noetic 和 mavros v1.20.1&#xff0c; 携带经纬度海拔的话题主要有三个&#xff1a; /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码&#xff0c;来分析他们的发布过程。发现前两个话题都对应了同一…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

用鸿蒙HarmonyOS5实现国际象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码&#xff0c;使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...