热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【C++从0到1】第九篇:STLstring类(上)

文章目录一、为什么要学习string类1.1C语言中的字符串二、标准库中的string类2.1string类(了解)2.2string类的常用接口说明一、为什么要学习string类

文章目录

  • 一、为什么要学习string类
    • 1.1 C语言中的字符串
  • 二、标准库中的string类
    • 2.1 string类(了解)
    • 2.2 string类的常用接口说明




一、为什么要学习string类

1.1 C语言中的字符串


C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。


二、标准库中的string类

2.1 string类(了解)


  1. 字符串是表示字符序列的类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总结:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_stringstring;
  4. 不能操作多字节或者变长字符的序列。

使用string类时,必须包含#include头文件以及using namespace std;

2.2 string类的常用接口说明

可以通过手册查看接口:C/C++参考手册

  1. string类对象的常见构造
    在这里插入图片描述

(constructor)函数名称功能说明
string() (重点)构造空的string类对象,即空字符串
string(const char* s) (重点)用C-string来构造string类对象
string(size_t n, char c)string类对象中包含n个字符c
string(const string&s) (重点)拷贝构造函数

在这里插入图片描述

  1. string类对象的容量操作

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也可以查看增容方式:这是PJ版本的增容方式
在这里插入图片描述
Linux下增容是增2倍。
在这里插入图片描述
在这里插入图片描述
注意:

  • size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
  • clear()只是将string中有效字符清空,不改变底层空间大小。
  • resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  • reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。
    在这里插入图片描述

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

函数名称功能说明
operator[] (重点)返回pos位置的字符,const string类对象调用
begin+ endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式

  • 下标遍历在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 迭代器遍历
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    注意:
    1,对于string,我们使用下标+[]足够好用,确实可以不用迭代器,但是对于其他容器(数据结构)就不可以了。所有的容器都可以使用迭代器。
    2&#xff0c;可不可以将!&#61;改为<呢&#xff1f;对于string是可以的&#xff0c;因为地址是连续的&#xff0c;但是不建议使用<&#xff0c;对于其他容器&#xff0c;比如list就不可以。
    使用迭代器使用const保护对象不被改变。
    在这里插入图片描述
    也可以使用C&#43;&#43;11新增的迭代器。但是我们还是更喜欢用以前的。
    在这里插入图片描述

  • 范围for遍历
    在这里插入图片描述


  1. string类对象的修改操作

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator&#43;&#61; (重点)在字符串后追加字符串str
c_str(重点)返回C格式字符串
find &#43; npos(重点)从字符串pos位置开始往后找字符c&#xff0c;返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c&#xff0c;返回该字符在字符串中的位置
substr在str中从pos位置开始&#xff0c;截取n个字符&#xff0c;然后将其返回

在这里插入图片描述
在这里插入图片描述
也可以直接使用&#43;&#61;&#xff1a;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 5.string类非成员函数

函数功能说明
operator&#43;尽量少用&#xff0c;因为传值返回&#xff0c;导致深拷贝效率低
operator>> &#xff08;重点&#xff09;输入运算符重载
operator<<&#xff08;重点&#xff09;输出运算符重载
getline &#xff08;重点&#xff09;获取一行字符串
relational operators &#xff08;重点&#xff09;大小比较

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 6.string类型与其他类型转换
    string类型转换成其他类型
    在这里插入图片描述
    在这里插入图片描述
    其他类型转换成string类型
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

推荐阅读
  • 什么是API?
    阅读编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者。初学者看到下面这一段话可能就有点头痛了。**API(Applicati ... [详细]
  • 行内块元素有哪些标签_css标签显示模式和CSS复合选择器
    块级元素(block-level)常见的块级元素~,,,,,等,其中标签是典型的块元素。块级元素的特点(1)比较霸道,自己独占一行(2)高度࿰ ... [详细]
  • 四十九、进程间通信——SystemVIPC之消息队列
    49.1SystemVIPC介绍49.1.1SystemVIPC概述UNIX系统存在信号、管道和命名管道等基本进程间通讯机制SystemV引入了三种高级进程间通信机制消息队列、共享 ... [详细]
  • 简述控制反转ioc_Spring 复盘 | IOC
    全面进入复习模式,从Spring开始。1、关于SpringSpring是一个轻量级的开源框架,是为解决企业应用开发的复杂性而创建的。我很不喜欢这种略显官 ... [详细]
  • 【漏洞分析】CVE20179765:深入分析一个影响数百万IoT设备的漏洞(含演示视频)
    【漏洞分析】CVE20179765:深入分析一个影响数百万IoT设备的漏洞(含演示视频) ... [详细]
  • 原文链接:yacc术语英文中文Thelexicalanalyzer词法分析器Literalcharacters原义字符Specification规范标准nonte ... [详细]
  • vuejs 传参 向 子组件 父组件_Notes14组件化父子组件的通信
    点击二白夫人不许错过我组件化••••操作软件:Webstorm插件:vue.js从官网下载https:cn.vuejs.orgv2guideinstallation. ... [详细]
  • 更多|表里_busybox的实现原理分析(C语言实现简易版的busybox)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了busybox的实现原理分析(C语言实现简易版的busybox)相关的知识,希望对你有一定的参考价值。1、li ... [详细]
  • 锁优化有3个方向:1.减少持有锁的时间:例如,将CPU密集和IO密集的任务移到锁外,可以有效减少持有锁的时间, ... [详细]
  • Alpha冲刺——第四天
    Alpha第四天听说031502543周龙荣(队长)031502615李家鹏031502632伍晨薇031502637张柽031502639郑秦1.前言任务 ... [详细]
  • LVS 原理
    LVS原理一、概述LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Dir ... [详细]
  • 1.数据库简介1.数据库的能干什么持久的存储数据备份和恢复数据快速的存取数据权限控制2.数据库的类型1.关系数据库​特点:以表和表的关联构成的数据结构 ... [详细]
  • JavaWeb的过滤器(Filter)的两种配置
    Filter接口要成为一个Filter需要实现Filter接口Filter生命周期容器启动就创建Filter实例,先执行无参构造器,然后执行init()方法,以后每次要过滤的请求会 ... [详细]
  • 2022_OO第三单元总结一、架构分析1.hw9基础架构和基本功能的搭建  hw9作为第三单元的第一次作业,基本上还是带我们熟悉jml的基础语法,搭建好整体的框架,实现一些基础功能 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloud-Eureka相关的知识,希望对你有一定的参考价值。原文:https://xsxy007.gith ... [详细]
author-avatar
悟哩兰荷_982
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有