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

news2024/11/19 13:22:21

在这里插入图片描述

🔥个人主页: 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::size
	cout << "字符串长度为" << str.size() << endl;

	// string::length
	cout << "字符串长度为" << 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;

    // at
    str.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更多的内容,感谢大家的支持。♥

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口测试及常用的接口测试工具(Postman/Jmeter)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接…

phpstudy靶场访问显示404 Not Found

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 一、检查phpstduy设置 localhost——管理——修改 1、根目录&#xff08;默认设置&#xff0c;不要改&#xff09; localhost这个域名必须保留&#xff0c;并且把根目录设置为phpstudy的WWW文…

Duplicate entry ‘asdfg‘ for key ‘clazz.name‘

Mybatis:java.sql.SQLIntegrityConstraintViolationException:Duplicate entry ‘asdfg’ for key ‘clazz.name’ 违反了数据库的唯一约束条件&#xff0c;即插入数据的时候具有唯一约束&#xff08;被unique修饰&#xff09;的列值重复了 在修改的过程中发生错误&#xff0c;…

WPF控件之StackPanel布局控件

StackPanel别名堆栈panel 使其子元素按照一定方式进行布局&#xff0c;子元素排布方式要么设置为水平排布&#xff0c;要么垂直排布。 属性 Orientation设置排列方式(默认的是垂直排布) : Horizontal水平排布 Vertical 垂直排布 实例 <StackPanel Orientation"Vert…

漏洞管理是如何在攻击者之前识别漏洞从而帮助人们阻止攻击的

漏洞管理 是主动查找、评估和缓解组织 IT 环境中的安全漏洞、弱点、差距、错误配置和错误的过程。该过程通常扩展到整个 IT 环境&#xff0c;包括网络、应用程序、系统、基础设施、软件和第三方服务等。鉴于所涉及的高成本&#xff0c;组织根本无法承受网络攻击和数据泄露。如果…

泛微E9开发 通过点击按钮来复制选择的明细行

泛微E9开发 通过点击按钮来复制选择的明细行 复制明细行功能背景展示效果实现方法 复制明细行 功能背景 用户可以通过“复制明细”按钮来实现新增选择的明细行&#xff0c;并且新增明细行的数据跟选择的数据完全一样&#xff0c;具体操作如下图所示&#xff1a; 手动新增明细…

[Collection与数据结构] Map与Set(一):二叉搜索树与Map,Set的使用

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

程序设计——前后端分离实现简单表白墙

文章目录 一、前端页面样式代码二、前后端衔接1. 后端创建 maven 项目2. 针对前后端交互的解释以及后端代码的实现针对 post 请求解释前后端衔接针对 Get 请求解释前后端衔接 3.后端与数据库的联系以及对数据的存取单独封装数据库连接代码解释后端存储 save 数据的代码解释后端…

【因特网中自治系统内部的路由选择,RIP 进程处理 OSPFOSPF(Open Shortest Path First)最短路径优先协议】

文章目录 因特网中自治系统内部的路由选择RIP&#xff08;Routing Information Protocol&#xff09;内部网关协议RIP通告&#xff08;advertisements&#xff09;RIP: 链路失效和恢复RIP 进程处理OSPF(Open Shortest Path First)最短路径优先协议OSPF “高级” 特性(在RIP中的…

吴恩达机器学习笔记 三十七 电影推荐系统 使用特征 成本函数 协同过滤算法

以电影评分系统为例&#xff0c;令 r(i, j) 来表示用户 j 已经对电影 i 评分&#xff0c; y&#xff08;i, j&#xff09;表示评分具体是多少。 假如每部电影有自己的特征&#xff0c;那么用户 j 对电影 i 的评分预测为 w(j) * x(i) b(j) r(i, j) &#xff1a;一个用户 j 是否…

mysql: docker 异常 - mbind: Operation not permitted

mbind: Operation not permitted 前言&#xff1a;正文:结论 &#xff1a; 前言&#xff1a; 用数据库处理平台问题今天报错&#xff0c;mbind: Operation not permitted。 mbind 不允许操作&#xff0c;一头雾水这是什么意思。 网上找了很多资料大概意思是&#xff1a; 这个错…

MATLAB 点云随机赋色 (68)

MATLAB 点云随机赋色 (68) 一、算法介绍二、算法介绍1.代码2.结果三、数据链接一、算法介绍 读取的点云本身带有颜色信息,有时我们需要为每个点随机赋予一种颜色,下面是具体效果和实现代码,以及使用的数据: 二、算法介绍 1.代码 代码如下(示例): % 读取点云文件 f…

Windows如何安装hadoop

var code "da0f4508-813e-4f6c-b5e8-6c19f92be6d1"Hadoop是一个开源的分布式计算平台&#xff0c;旨在处理大规模数据的存储和处理。它提供了分布式文件系统&#xff08;HDFS&#xff09;和分布式计算框架&#xff08;MapReduce&#xff09;&#xff0c;使得用户能够…

12 华三的二层链路聚合

12 华三的二层链路聚合 配置思路 1. 配置二层静态聚合组 (1) 进入系统视图。 system-view (2) 创建二层聚合接口&#xff0c;并进入二层聚合接口视图。 interface bridge-aggregation interface-number [ lite ] 创建二层聚合接口后&#xff0c;系统将自动生成…

Windows系统下修改文件夹和U盘图标实战

文章目录 知识学习一、修改磁盘图标第一步、新建.INF文件第二步、放置图标第三步、重新插入U盘第四步、隐藏与显示文件知识拓展 二、修改文件夹图标设置图标样式恢复图标样式 在日常办公中使用的是windows系统&#xff0c;系统默认的文件图标都一样&#xff0c;不利于分类整理&…

使用Python Pandas实现两表对应列相加(即使表头不同)

目录 引言 Pandas库简介 实现对应列相加 步骤一&#xff1a;加载数据 步骤二&#xff1a;重命名列 步骤三&#xff1a;对应列相加 步骤四&#xff1a;保存结果 案例分析 结论 引言 在数据分析和处理的日常工作中&#xff0c;我们经常会遇到需要将来自不同数据源的数据…

拼多多投产比怎么逐步调高

提高拼多多的投产比&#xff08;ROI&#xff09;需要综合考虑多个因素&#xff0c;包括点击量、转化率、客单价以及点击花费。以下是一些有效的方法&#xff1a; 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自…

DDD领域驱动模型设计

醍醐灌顶了朋友们 第一次写ddd还是 一路走来 丢失了东西 现在倒是也能找回来 只是有点可惜了 选择比努力更重要 独立功能 应用层&#xff1a;组织业务逻辑 领域&#xff1a;实体对象领域&#xff0c;业务核心 数据仓库&#xff1a; 不影响业务封装了数据操作&#xff0c;…