C++中的STL-string类

文章目录

    • 一、为什么学习string类?
      • 1.1 C语言中的字符串
    • 二、准库中的string类
      • 2.2 string类
      • 2.3 string类的常用接口说明
      • 2.4 string类对象的容量操作
      • 2.5 string类对象的访问及遍历操作
      • 2.5 string类对象的修改操作
      • 2.7 string类非成员函数
      • 2.8 模拟实现string

一、为什么学习string类?

1.1 C语言中的字符串

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

二、准库中的string类

2.2 string类

string类文档

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

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

2.3 string类的常用接口说明

  1. string类对象的常见构造:文档说明

在这里插入图片描述

  • 下面就可以这样使用
int main()
{string s0;string s1("hello world");string s2(s1);string s3(s1, 5, 3);string s4(s1, 5, 10);string s5(s1, 5);cout << s0 << endl;cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;cout << s5 << endl;string s6(10, '#');cout << s6 << endl;s0 = s6;cout << s0 << endl;return 0;
}

在这里插入图片描述

2.4 string类对象的容量操作

  • 可以看下面的概图

在这里插入图片描述

  • 接下来我们一个一个看看

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

在这里插入图片描述

  • max_size()是返回最大存放多少个字符
  • 每个平台可能不一样

在这里插入图片描述

  • 大家可以看这里的测试,第一次是15,第二次是2倍扩容,第三次,第四次…都是1.5倍扩容

在这里插入图片描述

  • 在linux平台下,默认从0开始,后续从2倍扩容

在这里插入图片描述

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

在这里插入图片描述

  • resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字 符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的 元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
void Teststring3()
{// 注意:string类对象支持直接用cin和cout进行输入和输出string s("hello, world!!!");cout << s.size() << endl;cout << s.length() << endl;cout << s.capacity() << endl;cout << s << endl;// 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小s.clear();cout << s.size() << endl;cout << s.capacity() << endl;// 将s中有效字符个数增加到10个,多出位置用'a'进行填充// “aaaaaaaaaa”s.resize(10, 'a');cout << s.size() << endl;cout << s.capacity() << endl;// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充// "aaaaaaaaaa\0\0\0\0\0"// 注意此时s中有效字符个数已经增加到15个s.resize(15);cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;// 将s中有效字符个数缩小到5个s.resize(5);cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;
}

在这里插入图片描述

  • 判断字符串是否为空

在这里插入图片描述

  • capacity缩小适合大小

  • 在vs下是缩小到刚刚说的倍数上

在这里插入图片描述

  • 在Linux下是缩小到size大小

在这里插入图片描述

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

在这里插入图片描述

  • 对于元素的访问操作我们有四种方式begin()+end() for [] 范围for(C++11支持)
void Teststring7()
{string s1("hello world");const string s2("Hello world");cout << s1 << " " << s2 << endl;cout << s1[0] << " " << s2[0] << endl;s1[0] = 'H';cout << s1 << endl;// s2[0] = 'h';   代码编译失败,因为const类型对象不能修改
}

在这里插入图片描述

  • 以下这些方法都是可以的
void Teststring6()
{string s("hello world");// 1. for+operator[]for (size_t i = 0; i < s.size(); ++i)cout << s[i] << ' ';cout << endl;// 2.迭代器string::iterator it = s.begin();while (it != s.end()){cout << *it << ' ';++it;}cout << endl;// string::reverse_iterator rit = s.rbegin();// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型auto rit = s.rbegin();while (rit != s.rend()) {cout << *rit << ' ';++rit;}cout << endl;// 3.范围forfor (auto ch : s)cout << ch << ' ';cout << endl;}

在这里插入图片描述

2.5 string类对象的修改操作

在这里插入图片描述

  • c_str和data使用差不多,但是c_str使用较多
  • 在比较的时候==是用的一个重载,而使用c_str比较是比较地址

在这里插入图片描述

  • 案例一:
  • 找后缀
// 获取file的后缀
string file("string.cpp");
// 从后往前找 '.'
size_t pos = file.rfind('.');
// 截取从pos位置开始到最后
string suffix(file.substr(pos,file.size() - pos));
cout << suffix << endl;

在这里插入图片描述

  • 案例二:

  • 获取url中的协议

  • 用find查找.,然后再使用substr截取字符串

string url("https://www.cplusplus.com/reference/string/string/find/");
cout << url << endl;size_t n = url.find(':');
if (n == string::npos)
{cout << "invalid url" << endl;return;
}
string protocol = url.substr(0, n);
cout << protocol << endl;
cout << url.substr(0, n) << endl;

在这里插入图片描述

  • 获取url中的域名
size_t start = url.find("://");
if (start == string::npos)
{cout << "invalid url" << endl;return;
}
start += 3; // 跳过 ://
size_t finish = url.find('/', start);
string address = url.substr(start, finish - start);
cout << address << endl;
cout << url.substr(start, finish - start) << endl;

在这里插入图片描述

  • 删除url的协议前缀
size_t pos = url.find("://");
url.erase(0, pos + 3);
cout << url << endl;

在这里插入图片描述


  • find_first_of

  • 查找字符串中的包含所有字符

在这里插入图片描述

  • find_first_not_of

在这里插入图片描述

  • 后面的last就是从后往前找,很简单,不再赘述

2.7 string类非成员函数

  • 这里比较重要的是getline()
  • 这个和C语言中的gets差不多,读一行,读到\n后停止
  • 这个还多一个功能,就是可以指定读到什么字符后停止

在这里插入图片描述

2.8 模拟实现string

  • 这个的模拟实现就到下一篇文章来写~~

最后,本文学习了C++中的string类,简单的介绍了几个比常用的几个接口,以及如何使用,感谢收看

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

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

相关文章

多项式回归算法模拟

python3.6 环境 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures# 生成随机数作为x变量&#xff0c;范围在-5到5之间&#xff0c;共100个样本 x np.random.un…

深度学习训练GPU显卡选型攻略

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f4d1;上期文章&#xff1a;『仪酷LabVIEW OD实战(5)——Object DetectionTensorRT工具包快速实现yolo目标检测』 &#x1f37b;本文由virobotics(仪酷智能)原创…

C++特性之一:继承

1. 派生类的成员变量、成员函数、构造、析构 2. 继承的切片 3. 重定义/隐藏 重定义/隐藏&#xff1a;派生类和基类有同名的成员&#xff0c;就叫隐藏。派生类的成员隐藏了基类的成员。 隐藏时可以通过类作用限定符来访问被隐藏的成员。 class Person { public:void Print(){…

代码学习记录19

随想录日记part19 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.14 主要内容&#xff1a;今天的主要内容是二叉树的第七部分&#xff0c;主要涉及修剪二叉搜索树 &#xff1b;将有序数组转换为二叉搜索树&#xff1b;把二叉搜索树转换为累加树。 669. 修剪…

【UE5】非持枪状态蹲姿移动的动画混合空间

项目资源文末百度网盘自取 在BlendSpace文件夹中单击右键选择动画(Animation)中的混合空间(Blend Space) &#xff0c;选择SK_Female_Skeleton&#xff0c;命名为BS_NormalCrouch 打开BS_NormalCrouch 水平轴表示角色的方向&#xff0c;命名为Direction&#xff0c;方向的最…

原生php单元测试示例

下载phpunit.phar https://phpunit.de/getting-started/phpunit-9.html 官网 然后win点击这里下载 新建目录 这里目录可以作为参考&#xff0c;然后放在根目录下 新建一个示例类 <?phpdeclare(strict_types1);namespace Hjj\DesignPatterns\Creational\Hello;class He…

Flutter可重排的列表控件ReorderableListView详解

文章目录 ReorderableListView 介绍主要属性使用示例注意事项 ReorderableListView 介绍 ReorderableListView 是 Flutter 中一个可重排的列表控件&#xff0c;允许用户通过拖动来改变列表项的顺序。它继承自 ListView&#xff0c;并提供了一些额外的功能来实现重排功能。 主…

安卓通过termux部署ChatGLM

一、安装Termux并进行相关配置 1、安装termux Termux 是一个 Android 终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个完整的 Linux 环境。 不需要 root 权限 Termux 就可以正常运行。Termux 基本实现 Linux 下的许多基本操作。可以使用 Termux 安装 python&…

DB算法原理与构建

参考&#xff1a; https://aistudio.baidu.com/projectdetail/4483048 Real-Time Scene Text Detection with Differentiable Binarization 如何读论文-by 李沐 DB (Real-Time Scene Text Detection with Differentiable Binarization) 原理 DB是一个基于分割的文本检测算…

区块链基础知识(上):区块链基本原理、加密哈希、公钥加密

目录 基本原理 加密哈希&#xff1a; 公钥加密&#xff1a; 希望有人向你发送只有你才能打开的加密文档/消息时使用 PKC 希望向其他人发送加密文档/消息并证明它确实由你发送时使用 PKC 使用 PKC 和加密哈希对文档/消息进行数字签名 交易哈希链使用数字签名转让数字资产所…

SenseNova 商汤日日新大模型 Function Call(函数调用)功能讲解和应用示例

考虑到使用 magic 申请 OpenAPI 的账号挺麻烦的&#xff0c;这里以商汤日日新大模型 SenseNova 介绍 Function Call 的功能。 官方链接&#xff1a;日日新开放平台 一、Function Call 是个啥&#xff1f; 在 LLM&#xff08;Large Language Model&#xff09; 语言大模型时代&…

YOLOv9实例分割教程|(二)验证教程

专栏地址&#xff1a;目前售价售价59.9&#xff0c;改进点30个 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 一、验证 打开分割验证文件&#xff0c;填入数据集配置文件、训练好的权重文件&…

报告合集 |2023年,5份必读的“数字孪生”行业报告合集(文末下载)

数字孪生正在快速改变多个行业的面貌。它通过创建物理世界对象的虚拟复制&#xff0c;使得数据分析和系统优化能够在数字空间中实现&#xff0c;正在制造业、城市规划、医疗保健等国家支柱行业展现出巨大的变革力量&#xff0c;为行业的智能决策和预测提供了强大的支撑。 作为…

【UE】AI行为树入门——以小白人跟踪玩家并攻击为例

目录 前言 效果 步骤 一、准备工作 二、用蓝图实现AI随机移动 三、用行为树实现AI随机移动与跟踪玩家并攻击的效果 3.1 AI随机移动 3.2 AI看到玩家后跟踪玩家 3.3 AI攻击玩家 前言 本篇文章要实现的效果是&#xff1a;小白人随机移动&#xff0c;并且在移动过程中如…

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程

电玩城游戏大厅计时软件怎么用&#xff0c;佳易王计时计费管理系统软件定时语音提醒操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费软件V18.0为例 说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件计时计费&#xff0c;只需点击开…

国际前十正规外汇实时行情走势app软件最新排名(综合版)

外汇交易&#xff0c;作为当今世界金融市场上一个重要的板块&#xff0c;备受关注和热议。随着金融市场的日益发展&#xff0c;外汇交易也发展成为一个新兴的投资交易渠道。为了更好地满足投资者对外汇市场的需求&#xff0c;外汇实时行情走势app软件应运而生&#xff0c;它为投…

Material UI 5 学习03-Text Field文本输入框

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Text Field文本输入框 一、最基本的本文输入框1、基础示例2、一些表单属性3、验证 二、多行文本 一、最基本的本文输入框 1、基础示例 import {Box, TextField} from "…

【Python】新手入门学习:详细介绍里氏替换原则(LSP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍里氏替换原则&#xff08;LSP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyT…

前端基础篇-深入了解 JavaScript(一)

文章目录 1.0 JavaScript 概述 2.0 JS - 引入方式 3.0 JS - 基础语法 4.0 JS - 数据类型 5.0 JS - 函数 6.0 JS - Array 数组 7.0 JS - String 字符串 1.0 JavaScript 概述 JavaScript(简称&#xff1a;JS)是一门夸平台、面向对象的脚本语言。使用来控制网页行为&#xff0c;它…

C++训练营:引用传递

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 一、引用传递 简单来说&#xff0c;“引用”就是给已有的变量起一个别名。引用并没有自己单独的内存空间&#xff0c;作为引用&#xff0c;它和原变量共用一段内存空间。引用的定义格…