【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++标准定义的,具体行为取决于编译器:
- 一种编译器(如VS),会选择无视这条命令,cpacity保持原来的大小。
- 另一种编译器(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)
🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 前言🔥容量接口(Capacity)size和lengthcapacitymax_sizereserveresizeclearemptyshrink_to_fit 🔥元素获取(Ele…...
【漏洞复现】某小日子太阳能系统DataCube3审计
漏洞描述 某小日子太阳能系统DataCube3终端测量系统 多个漏洞利用方式 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进…...
探索Java的未来
目录 一、云计算与大数据 二、人工智能与机器学习 三、物联网与边缘计算 四、安全性与性能优化 五、社区与生态 Java,作为一种广泛使用的编程语言,自其诞生以来就以其跨平台性、面向对象特性和丰富的库资源赢得了开发者的青睐。然而,随着…...
Web3 ETF软件开发
开发Web3 ETF软件涉及到金融、法律和技术等多个领域的专业知识,因此存在以下技术难点,开发Web3 ETF软件是一项复杂的技术挑战,需要综合考虑各种因素。开发人员需要具备较强的技术能力和跨学科知识才能成功开发Web3 ETF软件。北京木奇移动技术…...
初始MySQL
初始化MySQL数据库通常涉及以下步骤: 下载并安装MySQL: 你可以从MySQL官方网站下载适合你的操作系统的MySQL安装包。安装时,遵循安装向导的步骤,通常包括选择安装位置、选择组件(例如MySQL服务器、MySQL Workbench等&a…...
STM32项目下载清单(不定时更新)
收集的一些资料,分享下载 电赛一等奖作品,老人健康监测智能手表(STM32F4主控) STM32数字示波器源码数字信号处理教程、配套实例基于stm32 nucleo_L476的智能灯(操作说明源码)基于STM32 NUCLEO板设计彩色LE…...
thinkphp5 配合阿里直播实现直播功能流程
要为你提供一个更详细的教程来结合ThinkPHP 5和阿里直播SDK实现直播功能,需要涵盖的内容相对较多。不过,我可以为你提供一个大致的、更详细的步骤指南,供你参考和扩展: 1. 准备工作 a. 注册阿里云账号 前往阿里云官网注册账号&…...
安卓手机APP开发__媒体3格式转换器__常见问题解答
安卓手机APP开发__媒体3格式转换器__常见问题解答 目录 1 为什么在示例的APP中我不能读取到本地的文件? 2 在一个特定的设备为什么导出失败? 3 媒体3格式转换器支持转码(或者是录制)远程的媒体吗? 4 媒体3格式转换…...
leetcode-有重复数字的全排列-98
题目要求 思路 1.同【没有重复项的全排列-97】这个题一样,都是递归的题,区别在于这个可能会包含重复的数字,因此,不能只是简单的通过两个值是否相等然后用标志位标记,而是新增了一个数组,这个数组专门用于…...
Unity数据持久化之XML
目录 数据持久化XML概述XML文件格式XML基本语法XML属性 C#读取存储XMLXML文件存放位置C#读取XML文件C#存储XML文件 实践小项目必备知识点XML序列化(不支持字典)XML反序列化IXmlSerializable接口让Dictionary支持序列化反序列化 数据持久化XML概述 什么是…...
Leetcode 226:翻转二叉树
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 思路:使用递归 //使用前序遍历翻转树public static TreeNode invertTree(TreeNode root){if(rootnull) return root;swap(root);invertTree(root.left);invertTree(root.rig…...
柯里化与无参装饰器
柯里化 柯里化的概念:柯里化(Currying)在Python中是一种编程技术,它将原本接受多个参数的函数转换为一系列接受单个参数的函数。这种方法以逻辑学家Haskell Curry的名字命名。 简而言之就是将一次函数调用变成先放入一个参数得到…...
Spring事务失效的场景
1. 事务方法执行期间出现了异常,但是并未指定rollbackFor: Spring默认只会在遇到error和RunTimeException时才会回滚。 public boolean rollbackon ( Throwable ex){return (ex instanceof RuntimeException || ex instanceof Error); } 2. 事务方法执行期间出现了…...
Python基础学习之datetime模块
在Python编程中,处理日期和时间是一个常见的需求。Python的datetime模块提供了丰富的类和方法,用于表示和操作日期、时间、时间间隔等。本文将详细介绍Python的datetime模块,并给出一些实用的示例。 1. datetime模块概览 datetime模块是Pyt…...
在AI大模型中全精度和半精度参数是什么意思?
环境: 大模型中 问题描述: 在AI大模型中全精度和半精度参数是什么意思? 解决方案: 在深度学习和高性能计算领域,"全精度"和"半精度"通常指的是模型中使用的数值表示的精度,具体涉…...
刷题记录2
文章目录 刷题记录21047.删除字符串中的所有相邻重复项150.逆波兰表达式求值239.滑动窗口最大值347.前k个高频元素144.二叉树前序遍历(145、94后序、中序)102.二叉树的层序遍历226.翻转二叉树101.对称二叉树104.二叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 …...
【配置】Docker搭建JSON在线解析网站
一个python朋友需要,顺便做一下笔记 正常用菜鸟的就够了,点下面 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 光线投射详细介绍可参考:https://en.wikipedia.org/wiki/Ray_casting, ThreeJS中,提供了Raycaster类,用于进行鼠标拾取,即:当三维场景中鼠标移动时,利用光线投射,…...
docker挂载数据卷-以nginx为例
目录 一、什么是数据卷 二、数据卷的作用 三、如何挂载数据卷 1、创建nginx容器挂载数据卷 2、查看数据卷 3、查看数据卷详情 4、尝试在宿主机修改数据卷 5、查看容器内对应的数据卷目录 6、 访问nginx查看效果 一、什么是数据卷 挂载数据卷本质上就是实…...
Docker-compose部署Fastapi项目
Docker-compose部署Fastapi、postgres、Redis、Nginx) 之前有写过使用容器部署的方式,这次尝试使用Docker-compose试一次大胆的尝试 使用容器的方式部署只是掌握这项技能的基础,在使用Docker-compose的过程中会有些稍许的不同。毕竟踩过的坑才算是跨过去…...
Eigen求解线性方程组
1、线性方程组的应用 线性方程组可以用来解决各种涉及线性关系的问题。以下是一些通常可以用线性方程组来解决的问题: 在实际工程和科学计算中,求解多项式方程的根有着广泛的应用。 在控制系统的设计中,我们经常需要求解特征方程的根来分析…...
7、Java基本数据类型的使用细节探讨(超详细版本)
Java基本数据类型的使用细节探讨 一、整数类型二、浮点数三、字符型四、布尔型 我觉得基本数据类型大家学计算机的应该都懂,但是韩顺平老师讲的基本类型的使用细节我觉得有必要记录一下,重新学的时候才发现有了新的感悟! 一、整数类型 使用细…...
MFC实现点击列表头进行排序
MFC实现点击列表头排序 1、添加消息处理函数 在列表窗口右键,类向导。选择 IDC_LIST1(我的列表控件的ID),消息选择LVN_COLUMNCLICK。 2、消息映射如下 然后会在 cpp 文件中生成以下函数 void CFLashSearchDlg::OnLvnColumnclic…...
用龙梦迷你电脑福珑2.0做web服务器
用龙梦迷你电脑福珑2.0上做web服务器是可行的。已将一个网站源码放到该电脑,在局域网里可以访问网站网页。另外通过在同一局域网内的一台windows10电脑上安装花生壳软件,也可以在外网访问该内网服务器网站网页。该电脑的操作系统属于LAMP。在该电脑上安装…...
秋招后端开发面试题 - JVM类加载机制
目录 JVM类加载机制前言面试题能说一下类的生命周期吗?类加载的过程知道吗?类加载器有哪些?什么是双亲委派机制?为什么要用双亲委派机制?如何破坏双亲委派机制?如何判断一个类是无用的类? JVM类…...
OceanBase 分布式数据库【信创/国产化】- OceanBase 配置项和系统变量概述
本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 配置项和系统变量概述前言OceanBase 数据更新架构OceanBase 配置项和系统变量概述配置项配置项分类配置项查询系统变量系统变量分类系统变量查询配置项与系统变量的区分OceanBase 分布式数据库…...
单单单单单の刁队列
在数据结构的学习中,队列是一种常用的线性数据结构,它遵循先进先出(FIFO)的原则。而单调队列是队列的一种变体,它在特定条件下保证了队列中的元素具有某种单调性质,例如单调递增或单调递减。单调队列在处理…...
电脑windows系统压缩解压软件-Bandizip
一、软件功能 Bandizip是一款功能强大的压缩和解压缩软件,具有快速拖放、高速压缩、多核心支持以及广泛的文件格式支持等特点。 Bandizip软件的功能主要包括: 1. 支持多种文件格式 Bandizip可以处理多种压缩文件格式,包括ZIP, 7Z, RAR, A…...
图片公式识别@文档公式识别@表格识别@在线和离线OCR工具
文章目录 abstract普通文字识别本地软件识别公式扩展插件下载小结 在线识别网站/API👺Quicker整合(推荐)可视化编辑和识别公式其他多模态大模型识别图片中的公式排版 开源模型 abstract 本文介绍免费图片文本识别(OCR)工具,包括普通文字识别,公式识别,甚至是手写公…...
怎么用织梦修改建设一个新的网站/seo站外优化平台
ADSL上网常见问题集锦Error 602 The port is already open 问题:拨号网络网络由于设备安装错误或正在使用,不能进行连接 原因:RasPPPoE没有完全和正确的安装 解决:卸载干净任何PPPoE软件,重新安装 Error 605 Cannot se…...
怎么建立自己公司的网站/免费b站推广网站入口
tldr;如果编码正确,离开&符号(或其他“特殊字符”)不是安全问题.也就是说,输出/使用是重要的,而不是输入.这一切都取决于最终如何使用数据.做一个< input value “” />例如,对于任意输入,没有正确编码.现在&通常比其他一些字符(比如’,’,)更不是“问题”,但在某…...
phpcms 网站根目录/网络营销渠道策略研究
获取所有的dom元素的方法:...
东莞网络营销全网推广/seo具体优化流程
计算平均值基础语法:{ $avg: }{ $avg: [ , ... ] }注:(1)$avg计算的时候会忽略非数值数据(包括缺失值)(2)在$group中使用时,若expression为数组,$avg会忽略这个expression进行计算(3)在其他管道符中使用时,对于单个expression&…...
wordpress找回密码收不到邮件/电商运营推广怎么做
Java之List集合三种排序方式方式一(Integer类型集合排序)方式二(对象类型集合排序)方式三(同样是对象类型集合排序 )方式一(Integer类型集合排序) public static void main(String[] args) {List<Integer> nums new ArrayList<Integer>();nums.add(3);nums.add(5…...
调教亲妹妹做性奴网站/关键词吉他谱
阅读本文前,请您先点击上面的蓝色字体“晓艳姐姐”,再点击“关注”,这样您就可以免费收到最新内容了。每天都有分享,完全是免费订阅,请放心关注。2020年了,win10的重大更新再次来袭!所以&#x…...