C++——string类

前言:哈喽小伙伴们,从这篇文章开始我们将进行若干个C++中的重要的类容器的学习。本篇文章将讲解第一个类容器——string。


目录

一.什么是string类

二.string类常见接口

1.string类对象的常见构造

 2.string类对象的容量操作

3. string类对象的访问及遍历操作

4.string类对象的修改操作

总结


一.什么是string类

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,其操作也并不能完全满足用户的期望。

而在C++的标准库中,默认存在一个string类,并且该类拥有很多的成员函数,来帮助我们更加方便的完成对字符串的一系列操作。

使用string类,需要包含头文件#include<string>。


二.string类常见接口

1.string类对象的常见构造

对于如何得到一个string类型的对象,有以下几种常见构造:

  • string()                                 构造空的string类对象,即空字符串
  • string(const char* s)          构造一个string类对象,其内容为s
  • string(size_t n,char c)        构造一个string类对象,其内容为n个c字符
  • string(const string&s)        拷贝构造函数,拷贝s字符串内容

实践代码如下:

#include<string>
#include<iostream>
using namespace std;int main()
{string s0;string s1("hello world!");string s2(5,'c');string s3(s1);cout << s0 << endl;cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;
}

结果如下:

其中s0为空字符串,所以第一行即为空。


 2.string类对象的容量操作

如何得到string类对象的信息以及对对象的操作,有如下方法:

  • size                返回字符串有效字符长度
  • length            返回字符串有效字符长度
  • capacity         返回空间总大小
  • empty            检测字符串释放为空串,是返回true,否则返回false
  • clear              清空有效字符
  • reserve          为字符串预留空间**
  • resize            将有效字符的个数该成n个,多出的空间用字符c填充

 测试如下:

#include<string>
#include<iostream>
using namespace std;int main()
{string s1("hello world!");s1.reserve(20);cout << s1.size() << endl;cout << s1.length() << endl;cout << s1.capacity() << endl;cout << s1.empty() << endl;s1.clear();cout << s1.empty() << endl;s1.resize(10, 'x');cout << s1 << endl;return 0;
}

结果如下: 

值得注意的是:

1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

2. clear()只是将string中有效字符清空,不改变底层空间大小。 

3.reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。 


3. string类对象的访问及遍历操作

如何对一个string类对象进行遍历操作,有如下方法:

  • operator[]             返回pos位置的字符,const string类对象调用
  • 范围for                  C++11支持更简洁的范围for的新遍历方式
  • 迭代器iterator         

operator[]对[]运算符的重载,实现数组下标的运算功能:

int main()
{string s1("hello world!");for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << ' ';}return 0;
}


范围for在前边的文章中已经介绍过了:

int main()
{string s1("hello world!");for (char e : s1){cout << e << ' ';}return 0;
}

可以认为是直接用一个临时变量e去一一访问s1字符串的字符


迭代器的作用是创建一个新的对象,可以遍历并选择序列中的一个对象,其关键字为iterator。

迭代器包含有若干方法,常用的有:

begin        获取一个字符串的首位字符

end           获取一个字符串的最后一个字符的下一个字符

用迭代器遍历字符串的方法为:

int main()
{string s1("hello world!");string::iterator it1 = s1.begin();while (it1 != s1.end()){cout << *it1 << ' ';it1++;}return 0;
}

这种方法,很类似于指针,但又与指针有很大不同,本文不做过多解释。

结果如下:


除此之外迭代器还可以反向遍历,需要关键字reverse_iterator,同时方法:

rbegin        获取一个字符串的最后一个字符的下一个字符

rend           获取一个字符串的首位符

int main()
{string s1("hello world!");string::reverse_iterator it1 = s1.rbegin();while (it1 != s1.rend()){cout << *it1 << ' ';it1++;}return 0;
}

 结果如下:


4.string类对象的修改操作

如何对一个string类对象进行各种修改操作,有如下方法:

  • push_back        在字符串后尾插字符c
  • append              在字符串后追加一个字符串
  • operator+=        在字符串后追加字符串str
  • c_str                  将C++格式的字符串转化为C语言格式的字符串
  • find + npos        从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
  • rfind                   从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
  • substr                在str中从pos位置开始,截取n个字符,然后将其返回

对于c_str在C语言格式下的字符串,其末尾都会有一个‘\0’用来统计该字符串的长度,而C++格式下的string字符串由于会有size方法来表示字符串长度,所以其字符串结尾不会有‘\0’

 使用案例如下:

int main()
{string s1 = "hello world";s1.push_back('!');cout << s1 << endl;s1.append(" hello");cout << s1 << endl;s1 += " C++";cout << s1 << endl;size_t pos1 = s1.find(' ');//从前往后找到s1中的' '字符并返回其下标位置if (pos1 != 'npos'){cout << s1.substr(pos1) << endl;//从pos位置开始截取字符}size_t pos2 = s1.rfind(' ');//从后往前找到s1中的' '字符并返回其下标位置if (pos1 != 'npos'){cout << s1.substr(pos2) << endl;//从pos位置开始截取字符}return 0;
}

结果如下:

总结

关于string类的用法到这里就分享完啦。

下篇文章将对string类各接口方法进行模拟实现讲解,敬请期待

最后希望能留下您的一键三连,我们下期再见!

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

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

相关文章

微软亚太区AI智能应用创新业务负责人许豪,将出席“ISIG-AIGC技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;AIGC开放社区、RPA中国、LowCode低码时代&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索A…

16 PyTorch 神经网络基础【李沐动手学深度学习v2】

1. 模型构造 在构造自定义块之前&#xff0c;我们先回顾一下多层感知机的代码。 下面的代码生成一个网络&#xff0c;其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层&#xff0c; 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 层和块 构造单层神经网咯…

智慧安防视频远程监控平台EasyCVR集成后播放只有一帧画面是什么原因?

智慧安防视频监控平台EasyCVR能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台可支持的接入协议包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议…

【Power Apps】实现一个响应式的对话框功能

在我们开始之前需要把这里关一下&#xff0c;不然的话会影响响应式布局的效果。 首先我们添加一个垂直容器作为遮罩层。 遮罩层的宽高直接设置为跟随父元素即可&#xff0c;让遮罩层占满整个屏幕&#xff0c;再把填充色改为有一定透明度的黑色&#xff0c;形成遮罩效果。 然后…

远程-debug

java -Xdebug -Xrunjdwp:transportdt_socket,servery,suspendy,address8888 -jar app.jar --server.port2023 & java项目如何远程Debug调试

C# 的一些好用的语法糖介绍

C# 中有很多语法糖&#xff08;Syntactic sugar&#xff09;&#xff0c;它们是一些语言特性&#xff0c;使得编写代码更加简洁、易读、更具表现力。 Lambda 表达式&#xff1a; Lambda 表达式允许你编写简洁的匿名函数。例如&#xff1a; Func<int, int, int> add (a,…

论文翻译 - Visual Adversarial Examples Jailbreak Large Language Models

论文链接&#xff1a;https://arxiv.org/pdf/2306.13213.pdf Visual Adversarial Examples Jailbreak Aligned Large Language Models Abstract1 Introduction2 Related Work3 Adversarial Examples as Jailbreakers3.1 Setup3.2 Our Attack3.3 Implementations of Attackers …

Python教程:time.perf_counter()计算程序运行的时间

time.perf_counter() 是 Python 中的一个函数&#xff0c;它属于 time 模块。它用于测量代码的执行时间&#xff0c;提供了一个高分辨率的性能计数器&#xff0c;通常用于基准测试、性能分析和时间测量。 以下是关于 time.perf_counter() 的一些关键点&#xff1a; 高分辨率&…

【b站咸虾米】1 Vue介绍 2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例

课程地址&#xff1a;【2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例】 https://www.bilibili.com/video/BV1pz4y1S7bC/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 感觉尚硅谷的Vue看完忘得差不多了&#xff0c;且之前学过咸虾米的unia…

Codeforces Round 932 (Div. 2) --- C. Messenger in MAC --- 题解

C Messenger in MAC 题目大意&#xff1a; 思路解析&#xff1a; 答案计算为 , 可以发现当所选的几个信息固定后&#xff0c;其实后面的一项就变为b_max - b_min&#xff0c;得到了这个结论之后&#xff0c;其实我们可以直接把整个信息按照b进行排序&#xff0c;枚举l,r&am…

机器学习:探索计算机的自我进化之路

当我们谈论机器学习时&#xff0c;我们在谈论什么呢&#xff1f;机器学习是一门跨学科的学科&#xff0c;它使用计算机模拟或实现人类学习行为&#xff0c;通过不断地获取新的知识和技能&#xff0c;重新组织已有的知识结构&#xff0c;从而提高自身的性能。简单来说&#xff0…

CentOS上安装JDK的详细教程

CentOS上安装JDK的详细教程 &#x1f31f; 前言 欢迎来到我的小天地&#xff0c;这里是我记录技术点滴、分享学习心得的地方。&#x1f4da; &#x1f6e0;️ 技能清单 编程语言&#xff1a;Java、C、C、Python、Go、前端技术&#xff1a;Jquery、Vue.js、React、uni-app、Ech…

基于OpenCV的图形分析辨认02

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&…

unbuntu一条命令安装docker

命令 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun报错and解决 一、没有Release文件 E: 仓库 “http://ppa.launchpad.net/paolorotolo/android-studio/ubuntu bionic Release” 没有 Release 文件。解决&#xff1a; cd /etc/apt/sources.list.d …

LVS负载均衡集群基础概念

目录 一、集群 1、集群概述 1.1 什么是集群 1.2 集群系统扩展方式 1.2.1 Scale UP&#xff08;纵向扩展&#xff09; 1.2.2 Scale OUT&#xff08;横向扩展&#xff09; 1.2.3 区别 1.3 分布式系统 1.4 分布式与集群 1.5 集群设计原则 1.6 集群设计实现 1.6.1 基础…

spring boot3token拦截器链的设计与实现

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 写在前面 流程分析 需要清楚的 实现步骤 1.定义拦截器 2.创建拦截器链配置类 3.配置拦截器链顺序 4.配置拦截…

【金三银四】面试题汇总(持续编写中)

Java八股文面试题汇总&#xff08;持续编写中~&#xff09; Java基础集合JUCJVM 数据库MySQLRedis 框架篇SSMSpringBoot 数据结构与算法数据结构与算法--汇总篇27道基础算法题&#xff0c;学完让你对算法有豁然开朗的感觉&#xff08;推荐小白&#xff09; 消息中间件RabbitMQK…

3.4日java作业---华为手机小米手机入库问题

​​​​​​​ ​​​​​​​ ​​​​​​​ 【案例】 任务描述 现要对华为和小米两种手机产品进行入库&#xff0c;本案例要求编写一个模拟商品入库的程序&#xff0c;可以在控制台输入入库商品的数量&#xff0c;最后打印出仓库中所有商品详细信息…

C语言指针(5):strlen与sizeof的区别及指针笔试题练习

1、sizeof和strlen的对比 sizeof sizeof计算变量所占内存内存空间⼤⼩的&#xff0c;单位是字节&#xff0c;如果操作数是类型的话&#xff0c;计算的是使⽤类型创建的变量所占内存空间的⼤⼩。简单来说&#xff0c;sizeof 只关注占⽤内存空间的⼤⼩&#xff0c;不在乎内存中存…

详解高质量增长的关键动力:ABM、数据、AI与业财融合

企业要穿越周期&#xff0c;不能仅靠节衣缩食&#xff0c;增长与盈利仍是必须。当盲目做大规模无法带来可持续发展&#xff0c;高质量增长便成为必须。在降本增效之上&#xff0c;企业需要变革增长模式。 在纷享销客的《领创者》开年直播上&#xff0c;纷享销客联合创始人、经…