string类(上)
string类(上)
- 1.标准库中的string类
- 2.string类对象的常见构造
- ①string()
- ②string(const char* s)
- ③string(size_t n,char c)
- ④string(const string&s)
- ⑤string(const string& str,size_t pos,size_t len=npos)
- ⑥string(const char* s,size_t n)
- 3.string类对象的容量操作
- ①size
- ②length
- ③capacity
- ④empty
- ⑤clear
- ⑥reserve
- ⑦resize
🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【C++的学习】
📝📝本篇内容:标准库中的string;string类对象的常见构造;string类对象的容量操作
⬆⬆⬆⬆上一篇:C++模板初阶
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-
1.标准库中的string类
string是表示字符串的字符串类
string在底层实际是:basic_string模板类的别名,typedef basic_string<char,char_traits,allocator>string
在使用string类时,必须包含#include头文件以及using namespace std;
2.string类对象的常见构造
①string()
构造空的string类对象,即空字符串

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s;cout << s << endl;return 0;
}
②string(const char* s)
用c-string来构造string类对象

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");cout << s << endl;return 0;
}
③string(size_t n,char c)
string类对象中包含n个字符c

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s(10,'c');cout << s << endl;return 0;
}
④string(const string&s)
拷贝构造函数

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s(10,'c');string s1(s);string s2 = s;cout << s << endl;cout << s1 << endl;cout << s2<< endl;return 0;
}
⑤string(const string& str,size_t pos,size_t len=npos)
复制从字符位置pos开始并跨越len字符的str部分(如果str太短或len为string::npos,则复制到str结尾)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");string s1(s,6,5);cout << s1<< endl;return 0;
}

上图是文档中查到的npos,他是一个无符号的unsigned int,值又是-1,所以说它就是无符号整形的最大值,因此,当你参数len作为缺省值或者大于str的长度时,他就是复制到str结尾


#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");string s1(s,6);cout <<s1 << endl;return 0;
}
⑥string(const char* s,size_t n)
从由s指向的字符数组中复制前n个字符

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world",5);cout << s << endl;return 0;
}
3.string类对象的容量操作
①size
返回字符串有效字符长度

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");cout << s.size()<<endl;return 0;
}
②length
返回字符串有效字符长度

和size功能一样,由于历史原因,所以说会有length,但是推荐使用size
③capacity
返回空间总大小

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");cout << s.capacity()<<endl;return 0;
}
④empty
检测字符串是否为空串,是返回true,否则返回false


⑤clear
清空有效字符

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");s.clear();cout << s.size() << endl;cout << s.capacity() << endl;return 0;
}
可以看出clear只是清空有效字符,但不会缩容
⑥reserve
为字符串预留空间

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");s.reserve(100);cout << s.size() << endl;cout << s.capacity() << endl;return 0;
}
可以把空间提前开大,但是打印出来的capacity大小并不是所设置的,这是因为还存在编译器对齐等各种原因,但是无论怎么样,开出的空间肯定大于等于你所设置的参数
⑦resize
将有效字符的个数改成n个,多出的空间用字符c填充

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");s.resize(20,'c');cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;return 0;
}
注意:
1.size()和length()方法底层实现完全原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是使用size()
2.clear()只是将string中有效字符清空,不改变底层空间大小
3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize是用0来填充多出的元素空间,resize(size_t n,char c)是用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果将元素个数增多,可能会改变底层容量大小,如果是将元素个数减少,底层空间总大小不变
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。知道需要多少空间,提前开空间,减少扩容,提高效率
当resize没给第二个参数时:

当resize的参数小于字符串有效长度时:

可以看出resize的参数小于字符串有效字符时,会进行清除字符
🌸🌸string类(上)的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪
相关文章:
string类(上)
string类(上)1.标准库中的string类2.string类对象的常见构造①string()②string(const char* s)③string(size_t n,char c)④string(const string&s)⑤string(const string& str,size_t pos,size_t lennpos)⑥string(const char* s,s…...
ElasticSearch快速入门详解(亲测好用,强烈推荐收藏)
3.快速入门 接下来快速看下elasticsearch的使用 3.1.概念 Elasticsearch虽然是一种NoSql库,但最终的目的是存储数据、检索数据。因此很多概念与MySQL类似的。 ES中的概念数据库概念说明索引库(indices)数据库(Database)ES中可…...
出入了解——Vue.js
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…...
MySQL8 双主(主主)架构部署实战
前言 大家好,我是 沐风晓月 本文收录于《数据库入门到精通系列》专栏, 更多内容可以关注我的csdn博客。 本文主要讲解MySQL主主架构实战,在开始之前需要根据下面的提示来配置环境: Linux基础命令不熟参考: 《linux基本功-基础…...
【数据结构】第三站:单链表
目录 一、顺序表的缺陷 二、链表 1.链表的概念以及结构 2.链表的分类 3.单链表的逻辑结构与物理结构 三、单链表的实现 1.单链表的定义 2.单链表的接口定义 3.单链表的接口实现 四、单链表的实现完整代码 一、顺序表的缺陷 在上一篇文章中,我们了解了顺序…...
【蓝桥杯2020】七段码
【题目描述】 七段码 HUSTOJ 题目导出文件 [蓝桥杯2020] 第十一届蓝桥杯第二次省赛—填空题E题 七段码 小蓝要用七段码数码管来表示一种特殊的文字。 上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a, b, c,…...
Spark读取JDBC调优
Spark读取JDBC调优,如何调参一、场景构建二、参数设置1.灵活运用分区列实际问题:工作中需要读取一个存放了三四年历史数据的pg数仓表(缺少主键id),需要将数据同步到阿里云 MC中,Spark在使用JDBC读取关系型数…...
【文心一言】什么是文心一言,如何获得内测和使用方法。
文心一言什么是文心一言怎么获得内测资格接下来就给大家展示一下文学创作商业文案创作数理逻辑推算中文理解多模态生成用python写一个九九乘法表写古诗前言: 🏠个人主页:以山河作礼。 📝📝:本文章是帮助大家了解文心…...
CentOS8服务篇10:FTP服务器配置与管理
一、安装与启动FTP服务器 1、安装VSFTP服务器所需要的安装包 #yum -y install vsftpd 2、查看配置文件参数 Vim /etc/vsftpd/vsftpd.conf (1)是否允许匿名登录 anonymous_enableYES 该行用于控制是否允许匿名用户登录。 (2&…...
笔试强训3.14
一、选择题 1.以下说法错误的是(C) A.数组是一个对象 B.数组不是一种原生类 C.数组的大小可以任意改变 D.在Java中,数组存储在堆中连续内存空间里 相关知识点:原生/内置数组是那八个,其他的都是引用的,借…...
elasticsearch 环境搭建和基本操作
参考资料 适合后端编程人员的elasticsearch快速实战教程 ElasticSearch最新实战教程 ElasticSearch配套笔记 自制搜索引擎 https://www.elastic.co/guide/en/elasticsearch/reference/7.17/setup.html restful风格的api REST 设计风格 例如以下springboot示例 RestContr…...
IDEA操作:Springboot项目打包为jar包并运行
在IDEA环境下对Springboot项目打包为jar包且在terminal运行操作 1、 2、 3、注意:在项目目录里创建一个用来存放jar包的文件夹(res),该路径不能使用IDEA设置的默认路径,必须手动创建。 4、 5、点击ok后加载运行包 (8…...
原理底层计划---JVM
二、JVM对空间大小怎么配置?各区域怎么划? 新生代:短时间生成,可以马上回收 老生代:少部分对象会存在很久,回收策略应不同 三、JVM哪些内存区域会发生内存溢出(程序计数器不会) …...
CSDN-猜年龄、纸牌三角形、排他平方数
猜年龄 原题链接:https://edu.csdn.net/skill/practice/algorithm-a413078fb6e74644b8c9f6e28896e377/2258 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议…...
【Linux】软件包管理器 yum
什么是软件包和软件包管理器 在 Linux 下需要安装软件时, 最原始的办法就是下载到程序的源代码, 进行编译得到可执行程序。但是这样太麻烦了,所以有些人就把一些常用的软件提前编译好, 做成软件包 ( 就相当于windows上的软件安装程序)放在服…...
一天吃透TCP面试八股文
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
zzu天梯赛选拔
C. NANA去上课 — 简单数学 需要记录上一步处在哪个位置 然后判断如果是同一侧移动距离就是abs(x1 - x2) 如果不同就是x1 x2 #include <iostream> #include <cmath> using namespace std; #define int long long signed main() {int n; c…...
【C语言】一篇让你彻底吃透(结构体与结构体位段)
本章重点 主要讲解结构体和位移动的使用和定义与声明,并且结构体和位段在内存中是如何存储的。 文章目录结构体结构体类型的声明结构体特殊的声明结构体变量的定义和初始化结构体成员的访问结构的自引用结构体内存对齐结构体传参位段什么是位段位段的内存分配位段的…...
数据结构之二叉树构建、广度/深度优先(前序、中序、后序)遍历
一、二叉树 1.1 树 说到树,我们暂时忘记学习,来看一下大自然的树: 哈哈 以上照片是自己拍的,大家凑合看看 回归正题,那么在数据结构中,树是什么呢,通过上面的图片大家也可以理解 树是一种非…...
“国产版ChatGPT”文心一言发布会现场Demo硬核复现
文章目录前言实验结果一、文学创作问题1 :《三体》的作者是哪里人?问题2:可以总结下三体的核心内容吗?如果要续写的话,可以从哪些角度出发?问题3:如何从哲学角度来进行续写?问题4:电…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
