【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::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更多的内容,感谢大家的支持。♥

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

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

相关文章

从零开始打造个性化生鲜微信商城小程序

随着移动互联网的普及&#xff0c;小程序商城已经成为越来越多商家的选择。本文将通过实战案例分享&#xff0c;教您如何在五分钟内快速搭建个性化生鲜小程序商城。 步骤一&#xff1a;登录乔拓云网后台&#xff0c;进入商城管理页面 打开乔拓云官网&#xff0c;点击右上角的“…

【连连国际注册_登录安全分析报告】

连连国际注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨…

队列 (Queue)

今日励志语句&#xff1a;别总听悲伤的歌&#xff0c;别总想从前的事&#xff0c;别让过去拖住脚&#xff0c;别让未来被辜负。 前言&#xff1a;前面写了一篇 栈的实现&#xff0c;接下来学习一下它的"兄弟" 一、队列的概念&#xff1a; 队列&#xff1a; 也是数据…

C++类和对象(三) 缺省值 | static成员 | 内部类

前言&#xff1a; 这是关于类和对象的最后一篇文章&#xff0c;当然还是基础篇的最后一篇&#xff0c;因为类的三大特性继承&#xff0c;封装和多态都还没有讲&#xff0c;少年&#xff0c;慢慢来。 缺省值&#xff1a; 之前讲过&#xff0c;在C11的新标准中&#xff0c;支持为…

百面算法工程师 | 支持向量机面试相关问题——SVM

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

哈夫曼编码python算法实现(图片版)

一、问题&#xff1a; 请使用哈夫曼编码方法对给定的字符串&#xff0c;进行编码&#xff0c;以满足发送的编码总长度最小&#xff0c;且方便译码。“AABBCCDDEEABCDDCDBAEEAAA” 二、过程&#xff1a; 三、结果&#xff1a;

软件1班20240509

文章目录 1.JDBC本质2.增3.改4.删5.查6.JDBC标准写法 1.JDBC本质 重写 接口的 方法 idea 报错 – 不动脑 alt enter 知道没有重写方法 CTRL o 重写 方法 快捷键 package com.yanyu;/*** Author yanyu666_508200729qq.com* Date 2024/5/9 14:42* description:*/ public interf…

网安学习路线终极指南!一步步带你从入门到精通,详尽技能点全解析!

目录 零基础小白&#xff0c;到就业&#xff01;入门到入土的网安学习路线&#xff01; 建议的学习顺序&#xff1a; 一、夯实一下基础&#xff0c;梳理和复习 二、HTML与JAVASCRIPT&#xff08;了解一下语法即可&#xff0c;要求不高&#xff09; 三、PHP入门 四、MYSQL…

(三十七)第 6 章 树和二叉树(二叉树的二叉链表存储表示实现)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? st…

欧洲杯/奥运会-云直播

欧洲杯/奥运会要来了&#xff0c;如何升级自己的网站让你的顾客都能观赏直播已提高用户量呢&#xff1f;&#xff01; 【功能完善、平滑兼容】 云直播支持 RTMP 推流、 HLS 源站等多种直播源接入方式&#xff0c;提供直播 SDK&#xff0c;支持多终端适配&#xff0c;上行码率…

蓝桥杯省三爆改省二,省一到底做错了什么?

到底怎么个事 这届蓝桥杯选的软件测试赛道&#xff0c;都说选择大于努力,软件测试一不卷二不难。省赛结束&#xff0c;自己就感觉稳啦&#xff0c;全部都稳啦。没想到一出结果&#xff0c;省三&#xff0c;g了。说落差&#xff0c;是真的有一点&#xff0c;就感觉和自己预期的…

LeetCode例题讲解:只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff…

JavaSwing课程设计-实现一个计算器程序

通过JavaSwing技术来实现计算器小程序&#xff0c;效果如下。 源码下载链接 源码下载 博主承诺真实有效&#xff0c;私信可提供支持

独家新闻:CSCWD 2024会议现场即时报道 天津之眼夜色如梦

会议之眼 快讯 备受瞩目的第27届国际计算机协同计算与设计大会&#xff08;CSCWD 2024&#xff09;于2024年5月8日在中国天津梅江中心皇冠假日酒店盛大开幕&#xff01;来自世界各地的专家学者齐聚一堂&#xff0c;共同探讨和分享在智能设计、制造和协同工作领域的最新研究成果…

【全开源】Java上门洗车小程序源码上门洗车APP 小程序源码支持二次开发6.0

功能特点&#xff1a; 跨界创新&#xff1a;融入科技元素&#xff0c;借助移动互联网快速发展&#xff0c;将科技引入到传统洗车业中。 科技赋能&#xff1a;具有智能化的特点&#xff0c;用户可以根据自身的需求选择不同的洗车项目和服务&#xff0c;包括洗车的时间、地点和服…

MFC实现点击列表头进行排序

MFC实现点击列表头排序 1、添加消息处理函数 在列表窗口右键&#xff0c;类向导。选择 IDC_LIST1&#xff08;我的列表控件的ID&#xff09;&#xff0c;消息选择LVN_COLUMNCLICK。 2、消息映射如下 然后会在 cpp 文件中生成以下函数 void CFLashSearchDlg::OnLvnColumnclic…

IPFoxy:什么是静态住宅IP?静态ISP代理指南

静态住宅代理&#xff08;也称为静态ISP代理&#xff09;是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务&#xff1f;下面我具体分享。 一、什么是静态住宅代理&#xff1f; 首先&#xff0c;我…

Hotcoin Research | 模块化将是大势所趋:拆解模块化区块链的现状和未来

关于模块化区块链叙事的讨论源于Celestia和其代币TIA的亮眼表现。实际上&#xff0c;模块化是未来区块链设计的主要发展方向和大势所趋。模块化区块链就像乐高积木一样&#xff0c;将区块链系统拆分为可重用的模块&#xff0c;通过定制组合可实现不同功能的区块链网络。这种灵活…

Leetcode—2079. 给植物浇水【中等】

2024每日刷题&#xff08;130&#xff09; Leetcode—2079. 给植物浇水 实现代码 class Solution { public:int wateringPlants(vector<int>& plants, int capacity) {int ans 0;int step 0;int cap capacity;bool flag false;for(int i 0; i < plants.siz…

C语言-整体内容简单的认识

目录 一、数据类型的介绍二、数据的变量和常量三、变量的作用域和生命周期四、字符串五、转义字符六、操作符六、常见的关键字6.1 关键字static 七、内存分配八、结构体九、指针 一、数据类型的介绍 sizeof是一个操作符&#xff0c;是计算机类型/变量所占内存空间的大小   sc…